在matplotlib颜色栏中隐藏每个第n个刻度标签的最干净方法?

Posted

技术标签:

【中文标题】在matplotlib颜色栏中隐藏每个第n个刻度标签的最干净方法?【英文标题】:Cleanest way to hide every nth tick label in matplotlib colorbar? 【发布时间】:2013-12-18 17:08:14 【问题描述】:

我的水平颜色条上的标签太靠近了,我不想进一步减小文本大小:

cbar = plt.colorbar(shrink=0.8, orientation='horizontal', extend='both', pad=0.02)
cbar.ax.tick_params(labelsize=8)

我想保留所有刻度,但删除所有其他标签。

我发现的大多数示例都将用户指定的字符串列表传递给 cbar.set_ticklabels()。我正在寻找一个通用的解决方案。

我玩弄了各种变化

cbar.set_ticklabels(cbar.get_ticklabels()[::2])

cbar.ax.xaxis.set_major_locator(matplotlib.ticker.MaxNLocator(nbins=4))

但我还没有找到神奇的组合。

我知道必须有一个干净的方法来使用定位器对象来做到这一点。

【问题讨论】:

你见过***.com/questions/6485000/… 吗?颜色栏上的刻度可能很挑剔(因为那里有一层可以轻松地从垂直翻转到水平,而无需更改太多代码(理想情况下只需添加一个 kwarg)) 是的。那篇文章很有帮助,我在初步测试期间运行了 update_ticks(),但提供的最终解决方案仍然涉及用户定义的刻度位置/标签列表。 如果有人想直接使用pyplot 而不是axes 对象:matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.xticks.html 【参考方案1】:

for循环ticklabels,并调用set_visible()

for label in cbar.ax.xaxis.get_ticklabels()[::2]:
    label.set_visible(False)

【讨论】:

就像做同样事情的另一种方法:你可以做plt.setp(cbar.ax.get_xticklabels()[::2], visible=False)。当然,这是相同的,但至少了解setp 会很方便。再说一次,fo​​r 循环更清晰且易于阅读,而 setp 除非您熟悉 matplotlib,否则不清楚。 如果你的颜色条是垂直的,你需要使用cbar.ax.yaxis.get_ticklabels()来代替 另外,您当然可以使用get_xticklabels()[1::2] 隐藏其他标签。如果轴的起点与刻度不一致,但您仍希望保持第一个(可见)刻度可见,这通常是必要的。 有没有办法改变标签的位置,让它们变成顶部、底部、顶部、底部......?这有助于保留所有标签而不会重叠。 另一种方法是交替使用顶部和底部标签,而不是删除所有其他标签。为此,我想出了一个解决方案:***.com/q/37161022/2005415【参考方案2】:

适合那些喜欢的人!

n = 7  # Keeps every 7th label
[l.set_visible(False) for (i,l) in enumerate(ax.xaxis.get_ticklabels()) if i % n != 0]

【讨论】:

太棒了!这比评分较高的答案更好,因为它更灵活。可以隐藏不止一个标签。 对于那些希望复制粘贴这个宏伟的单行线的人:确保您已经为您在脚本中编写的任何绘图命令分配了一个变量名称“ax”(例如使用 ax = plt .subplot(); ax.plot(),而不是 plt.subplot(); plt.plot())【参考方案3】:

刚看到这个帖子,很好的答案。 我正在寻找一种方法来隐藏第 n 个刻度之间的每个刻度。并找到了枚举函数。因此,如果其他人正在寻找类似的东西,您可以这样做。

for index, label in enumerate(ax.xaxis.get_ticklabels()):
    if index % n != 0:
        label.set_visible(False)

【讨论】:

【参考方案4】:

我使用以下显示每 7 个 x 标签:

plt.scatter(x, y)
ax = plt.gca()
temp = ax.xaxis.get_ticklabels()
temp = list(set(temp) - set(temp[::7]))
for label in temp:
    label.set_visible(False)
plt.show()

它非常灵活,因为您可以做任何您想做的事情,而不是 plt.scatter。希望对您有所帮助。

【讨论】:

以上是关于在matplotlib颜色栏中隐藏每个第n个刻度标签的最干净方法?的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib 颜色条刻度标签格式

如何更改 Matplotlib 中颜色条刻度标签的字体大小?

在 matplotlib 颜色栏中设置次要刻度的数量

Matplotlib 3.3.3:更改单个刻度的颜色不再起作用

Matplotlib - 如何删除颜色条但保持热图位置不变

Matplotlib颜色条在左侧/对侧刻度