【问题标题】:Ticks and Labels at different positions in axis轴上不同位置的刻度和标签
【发布时间】:2018-11-07 23:16:16
【问题描述】:

我正在尝试制作一个图形,我希望在其中有标签,并且在 x 轴上也有刻度,但在不同的位置。但是,似乎在设置第一个刻度后,在尝试定义新的刻度时,以前的刻度被“遗忘”了。例如:

import matplotlib.pyplot as plt

xs = [1, 4, 7, 11, 14, 17, 20, 23, 26, 29]
ys = [2.0, 1.667, 2.0, 0.333, 1.0, 0.667, 1.667, 1.0, 1.0, 1.0]

# where we want our labels
ticks1 = [5.0, 15.0, 25.0]
labs = ['A', 'B', 'C']

fig, ax = plt.subplots()
ax.plot(xs, ys)

# I think I have to define ticks here to position the labels...
ax.set_xticks(ticks1)
ax.set_xticklabels(labs)

ax.tick_params(axis='x', length=0)

plt.show()

到目前为止还不错,有想要的安排。 ABC 用于标记不同组的数据点,它们或多或少位于每个组的中间(我会在后面添加垂直线以使这种分离更加明显),但刻度应该反映数据,而不是这些人造标签。

但是,如果我现在尝试在同一轴上添加一组不同的刻度,上面绘制的标签会迁移到新的刻度并且不会保留它们的旧位置:

# ...but want to have ticks for this range
ticks2 = [x for x in range(0, 33, 3)]
ax.set_xticks(ticks2)
ax.tick_params(axis='x', length=5)

plt.show()

matplotlib 中实现所需输出的正确方法是什么?

【问题讨论】:

    标签: python-3.x matplotlib


    【解决方案1】:

    Matplotlib 轴通过定位器和格式化程序进行标记。定位器告诉轴在哪里放置刻度。格式化程序在这些刻度上放置一个标签。

    当使用ax.set_xticks 时,您正在创建一个FixedLocator,即一组要勾选的固定位置。
    使用 ax.set_xticklabels 时,您正在创建一个 FixedFormatter,即一组固定的字符串以逐个放置在刻度上。

    当您通过ax.set_xticks(ticks2) 设置新刻度时,您没有更改格式化程序。它仍会使用其列表中的字符串格式化前三个刻度。
    这就是说:您还需要为更改的大小写设置新的刻度标签。

    例如通过

    ax.set_xticklabels(list("ABCDEFGHIJ"))
    

    现在,如果您想在标签以外的其他位置添加刻度,这实际上意味着您需要两对定位器和格式化程序。

    一对定位器-格式化器将勾选 3 的倍数,并使用空字符串作为标签。另一对将勾选 5、15、25,并将它们的标签设置为 A、B、C。

    import matplotlib.pyplot as plt
    
    xs = [1, 4, 7, 11, 14, 17, 20, 23, 26, 29]
    ys = [2.0, 1.667, 2.0, 0.333, 1.0, 0.667, 1.667, 1.0, 1.0, 1.0]
    
    fig, ax = plt.subplots()
    ax.plot(xs, ys)
    
    # Major ticks
    ticks2 = [x for x in range(0, 33, 3)]
    ax.set_xticks(ticks2)
    ax.set_xticklabels([])
    ax.tick_params(axis='x', which="major", length=5)
    
    # Minor ticks
    ticks1 = [5.0, 15.0, 25.0]
    labs = ['A', 'B', 'C']
    ax.set_xticks(ticks1, minor=True)
    ax.set_xticklabels(labs, minor=True)
    ax.tick_params(axis='x', which="minor",length=0)
    
    
    plt.show()
    

    【讨论】:

    • 但我想要一些与之相反的东西,即。保持与第一次调用相同的“ABC”标签,然后添加新的刻度而不再次标记它,以便将“ABC”保持在第一个位置
    • 这听起来很奇怪。初始位置是5, 15, 25,新位置是3的倍数,也就是说初始位置5和25都没有了,因此不能打勾。
    • 所以5, 15, 25 将用于标签,但 3 的倍数用于刻度,我想这需要 2 个不同的格式化程序?
    • 两组不同的(定位器+格式化器)。请注意,它们总是成对出现。
    • 我觉得很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多