Change values on matplotlib imshow() graph axis

前端 未结 2 625
我在风中等你
我在风中等你 2020-11-30 23:05

Say I have some input data:

data = np.random.normal(loc=100,scale=10,size=(500,1,32))
hist = np.ones((32,20)) # initialise hist
for z in range(32):
    hist[         


        
相关标签:
2条回答
  • 2020-11-30 23:54

    I had a similar problem and google was sending me to this post. My solution was a bit different and less compact, but hopefully this can be useful to someone.

    Showing your image with matplotlib.pyplot.imshow is generally a fast way to display 2D data. However this by default labels the axes with the pixel count. If the 2D data you are plotting corresponds to some uniform grid defined by arrays x and y, then you can use matplotlib.pyplot.xticks and matplotlib.pyplot.yticks to label the x and y axes using the values in those arrays. These will associate some labels, corresponding to the actual grid data, to the pixel counts on the axes. And doing this is much faster than using something like pcolor for example.

    Here is an attempt at this with your data:

    import matplotlib.pyplot as plt
    
    # ... define 2D array hist as you did
    
    plt.imshow(hist, cmap='Reds')
    x = np.arange(80,122,2) # the grid to which your data corresponds
    nx = x.shape[0]
    no_labels = 7 # how many labels to see on axis x
    step_x = int(nx / (no_labels - 1)) # step between consecutive labels
    x_positions = np.arange(0,nx,step_x) # pixel count at label position
    x_labels = x[::step_x] # labels you want to see
    plt.xticks(x_positions, x_labels)
    # in principle you can do the same for y, but it is not necessary in your case
    
    0 讨论(0)
  • 2020-11-30 23:57

    I would try to avoid changing the xticklabels if possible, otherwise it can get very confusing if you for example overplot your histogram with additional data.

    Defining the range of your grid is probably the best and with imshow it can be done by adding the extent keyword. This way the axes gets adjusted automatically. If you want to change the labels i would use set_xticks with perhaps some formatter. Altering the labels directly should be the last resort.

    fig, ax = plt.subplots(figsize=(6,6))
    
    ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
    ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio
    

    enter image description here

    0 讨论(0)
提交回复
热议问题