更改网格间隔并在Matplotlib中指定刻度标签

时间:2014-07-24 21:07:49

标签: python matplotlib plot grid label

我试图在网格图中绘制计数,但我无法弄清楚我是如何去做的。我想:

  1. 以5

  2. 的间隔设置网格
  3. 每20个

  4. 只有主要的刻度标签
  5. 我希望刻度线在情节之外。

  6. 有"计数"在那些网格内

  7. 我已检查过herehere等潜在重复项,但我无法弄明白。

    这是我的代码。

    import matplotlib.pyplot as plt
    from matplotlib.ticker import MultipleLocator, FormatStrFormatter
    
    for key, value in sorted(data.items()):
        x = value[0][2]
        y = value[0][3]
        count = value[0][4]
    
        fig = plt.figure()
        ax = fig.add_subplot(111)
    
        ax.annotate(count, xy = (x, y), size = 5)
        # Overwrites and I only get the last data point
    
        plt.close()
        # Without this, I get "fail to allocate bitmap" error
    
    plt.suptitle('Number of counts', fontsize = 12)
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    plt.axes().set_aspect('equal')
    
    plt.axis([0, 1000, 0, 1000])
    # This gives an interval of 200
    
    majorLocator   = MultipleLocator(20)
    majorFormatter = FormatStrFormatter('%d')
    minorLocator   = MultipleLocator(5)
    # I want minor grid to be 5 and major grid to be 20
    plt.grid()
    
    filename = 'C:\Users\Owl\Desktop\Plot.png'
    plt.savefig(filename, dpi = 150)
    plt.close()
    

    这就是我得到的。

    This is what I get.

    我也有覆盖数据点的问题,我也遇到了麻烦......有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:125)

您的代码中存在多个问题。

首先是大的:

  1. 您正在循环的每次迭代中创建一个新图形和一个新轴 将fig = plt.figureax = fig.add_subplot(1,1,1)放在循环之外。

  2. 请勿使用定位器。使用正确的关键字调用函数ax.set_xticks()ax.grid()

  3. 使用plt.axes(),您将再次创建新轴。使用ax.set_aspect('equal')

  4. 小事: 您不应该将类似MATLAB的语法(如plt.axis())与目标语法混合使用。 使用ax.set_xlim(a,b)ax.set_ylim(a,b)

    这应该是一个有用的最小例子:

    import numpy as np
    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    
    # Major ticks every 20, minor ticks every 5
    major_ticks = np.arange(0, 101, 20)
    minor_ticks = np.arange(0, 101, 5)
    
    ax.set_xticks(major_ticks)
    ax.set_xticks(minor_ticks, minor=True)
    ax.set_yticks(major_ticks)
    ax.set_yticks(minor_ticks, minor=True)
    
    # And a corresponding grid
    ax.grid(which='both')
    
    # Or if you want different settings for the grids:
    ax.grid(which='minor', alpha=0.2)
    ax.grid(which='major', alpha=0.5)
    
    plt.show()
    

    输出是这样的:

    Ålot output

答案 1 :(得分:0)

MaxNoe's answer的细微选择,您无需显式设置刻度,而是设置节奏。

import matplotlib.pyplot as plt
from matplotlib.ticker import (AutoMinorLocator, MultipleLocator)

fig, ax = plt.subplots(figsize=(10, 8))

# Set axis ranges; by default this will put major ticks every 25.
ax.set_xlim(0, 200)
ax.set_ylim(0, 200)

# Change major ticks to show every 20.
ax.xaxis.set_major_locator(MultipleLocator(20))
ax.yaxis.set_major_locator(MultipleLocator(20))

# Change minor ticks to show every 5. (20/4 = 5)
ax.xaxis.set_minor_locator(AutoMinorLocator(4))
ax.yaxis.set_minor_locator(AutoMinorLocator(4))

# Turn grid on for both major and minor ticks and style minor slightly
# differently.
ax.grid(which='major', color='#CCCCCC', linestyle='--')
ax.grid(which='minor', color='#CCCCCC', linestyle=':')

Matplotlib Custom Grid