Adjusting gridlines and ticks in matplotlib imshow

前端 未结 4 1117
遇见更好的自我
遇见更好的自我 2021-02-01 15:07

I\'m trying to plot a matrix of values and would like to add gridlines to make the boundary between values clearer. Unfortunately, imshow decided to locate the tick marks in the

相关标签:
4条回答
  • 2021-02-01 15:27

    One can find it easier to use plt.pcolor or plt.pcolormesh:

    data = np.random.rand(10, 10)
    plt.pcolormesh(data, edgecolors='k', linewidth=2)
    ax = plt.gca()
    ax.set_aspect('equal')
    

    Though, there are some differences among them and plt.imshow, the most obvious being that the image is swapped by the Y-axis (you can reversed it back easily by adding ax.invert_yaxis() though). For further discussion see here: When to use imshow over pcolormesh?

    0 讨论(0)
  • 2021-02-01 15:29

    Code for solution as suggested by Serenity:

    plt.figure()
    im = plt.imshow(np.reshape(np.random.rand(100), newshape=(10,10)),
                    interpolation='none', vmin=0, vmax=1, aspect='equal')
    
    ax = plt.gca();
    
    # Major ticks
    ax.set_xticks(np.arange(0, 10, 1))
    ax.set_yticks(np.arange(0, 10, 1))
    
    # Labels for major ticks
    ax.set_xticklabels(np.arange(1, 11, 1))
    ax.set_yticklabels(np.arange(1, 11, 1))
    
    # Minor ticks
    ax.set_xticks(np.arange(-.5, 10, 1), minor=True)
    ax.set_yticks(np.arange(-.5, 10, 1), minor=True)
    
    # Gridlines based on minor ticks
    ax.grid(which='minor', color='w', linestyle='-', linewidth=2)
    

    Resulting image:

    0 讨论(0)
  • 2021-02-01 15:36

    You can shift the pixels by passing the extent argument to imshow. extent is a 4-element list of scalars (left, right, bottom, top):

    foo = np.random.rand(35).reshape(5, 7)
    # This keeps the default orientation (origin at top left):
    extent = (0, foo.shape[1], foo.shape[0], 0)
    _, ax = plt.subplots()
    ax.imshow(foo, extent=extent)
    ax.grid(color='w', linewidth=2)
    ax.set_frame_on(False)
    

    0 讨论(0)
  • 2021-02-01 15:37

    Try to shift axes ticks:

    ax = plt.gca()
    ax.set_xticks(np.arange(-.5, 10, 1))
    ax.set_yticks(np.arange(-.5, 10, 1))
    ax.set_xticklabels(np.arange(1, 12, 1))
    ax.set_yticklabels(np.arange(1, 12, 1))
    

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