在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
会很方便。再说一次,for 循环更清晰且易于阅读,而 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 中颜色条刻度标签的字体大小?