Hello,

I have 2d array with fourier amplitudes that I would like to plot. I
found two options: contourf and imshow. This is my code:

    omega = np.fft.rfftn(b_field, axes=(1, 0))
    omega = np.abs(np.fft.fftshift(omega, axes=(1,)))
    fig = plt.figure()
    ax = fig.add_subplot(111)
    M = omega.shape[0]
    N = omega.shape[1]
    ax.set_title('Spectrum')
    ax.set_ylabel(r'Poloidal Mode Number m')
    ax.set_xlabel(r'Toroidal Mode Number n')
    ax.grid(True)

    # Get rid of normalization
    omega /= np.prod(omega.shape)
    
The problem with contourf is that I can't seem to stop it from
strongly interpolating the data, which obscures the discrete nature:
(see www.rath.org/contourf.png)

    ctr = ax.contourf(np.arange(-N / 2, N / 2),
                      np.arange(0, M),
                      omega * 10000, 100, cmap=cm.YlOrRd, 
interpolation='nearest')
    fig.colorbar(ctr)
    ax.set_xlim(xmin= -(N - 1) / 2, xmax=(N - 1) / 2)
    ax.set_ylim(ymin=0, ymax=M - 1)
    fig.show()

Apparently contourf does not accept the interpolation='nearest' option.
Is there a way to make it stop interpolating?

The problem with imshow is, that it rescales the data so the
colorbar does not show the correct amplitudes (see
www.rath.org/imshow.png):

    ctr = ax.imshow(omega, cmap=cm.YlOrRd, aspect='equal', 
interpolation='nearest',
                    origin='lower', extent=(-(N-1)/2, (N-1)/2, 0, M-1))
    fig.colorbar(ctr)
    ax.set_xlim(xmin= -(N - 1) / 2, xmax=(N - 1) / 2)
    ax.set_ylim(ymin=0, ymax=M - 1)
    fig.show()

Is there a way to get the proper amplitudes into the colorbar?


Thanks!


   -Nikolaus

-- 
 »Time flies like an arrow, fruit flies like a Banana.«

  PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6  02CF A9AD B7F8 AE4E 425C

------------------------------------------------------------------------------
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to