Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

imshow when you are plotting data, not images. Realtion between aspect and extent?

I am plotting a 2D data array with imshow in matplotlib. I have a problem trying to scale the resulting plot. The size of the array is 30x1295 points, but the extent in units are: extent = [-130,130,0,77] If I plot the array without the extent, I get the right plot, but if I use extent, I get this plot with the wrong aspect. It is a pretty beginner question, but there is always a first time: How I can control the aspect and the size of the plot at the same time? Thanks,

Alex

P.D. The code is, for the right case: imshow(np.log10(psirhoz+1e-5),origin='lower')

and for the wrong one: imshow(np.log10(psirhoz+1e-5),origin='lower', extent =[z_ax.min(),z_ax.max(),rho_ax.min(),rho_ax.max()])

I hope this clarify a bit things.

like image 377
AlexNoir Avatar asked Sep 13 '13 10:09

AlexNoir


People also ask

What is extent in Imshow Python?

Extent defines the left and right limits, and the bottom and top limits. It takes four values like so: extent=[horizontal_min,horizontal_max,vertical_min,vertical_max] .

What is plot Imshow?

imshow. The matplotlib function imshow() creates an image from a 2-dimensional numpy array. The image will have one square for each element of the array. The color of each square is determined by the value of the corresponding array element and the color map used by imshow() .

How do you normalize Imshow?

Just specify vmin=0, vmax=1 . By default, imshow normalizes the data to its min and max. You can control this with either the vmin and vmax arguments or with the norm argument (if you want a non-linear scaling).

How do you plot multiple images on Imshow?

The easiest way to display multiple images in one figure is use figure(), add_subplot(), and imshow() methods of Matplotlib. The approach which is used to follow is first initiating fig object by calling fig=plt. figure() and then add an axes object to the fig by calling add_subplot() method.


2 Answers

I'm guessing that you're wanting "square" pixels in the final plot?

For example, if we plot random data similar to yours:

import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((30, 1295))

fig, ax = plt.subplots()
ax.imshow(data, extent=[-130,130,0,77])
plt.show()

We'll get an image with "stretched" pixels:

enter image description here

So, first off, "aspect" in matplotlib refers to the aspect in data coordinates. This means we have to jump through a couple of hoops to get what you want.

import numpy as np
import matplotlib.pyplot as plt

def main():
    shape = (30, 1295)
    extent = [-130,130,0,77]

    data = np.random.random(shape)

    fig, ax = plt.subplots()
    ax.imshow(data, extent=extent, aspect=calculate_aspect(shape, extent))
    plt.show()

def calculate_aspect(shape, extent):
    dx = (extent[1] - extent[0]) / float(shape[1])
    dy = (extent[3] - extent[2]) / float(shape[0])
    return dx / dy

main()
like image 156
Joe Kington Avatar answered Nov 15 '22 18:11

Joe Kington


In this case, pyplot.matshow() might also be useful:

from matplotlib import pyplot as plt
import numpy as np
dat = np.array(range(9)).reshape(3,3)
plt.matshow(dat)
plt.show()

result:

enter image description here

like image 25
Keith Hughitt Avatar answered Nov 15 '22 20:11

Keith Hughitt