Matplotlib中颜色条刻度标签的旋转

8
我想把颜色条刻度标签旋转,使其竖向而非横向显示。我已经尝试了许多变化,包括使用cbar.ax.set_xticklabels、cbar.ax.ticklabel_format等,并加上rotation='vertical',但还没有达到预期的效果。
下面是一个最小化工作示例:
import numpy as np
import matplotlib.pyplot as plt

#example function
x,y = np.meshgrid(np.linspace(-10,10,200),np.linspace(-10,10,200))
z = x*y*np.exp(-(x+y)**2)

#array for contourf levels
clevs = np.linspace(z.min(),z.max(),50)

#array for colorbar tick labels
clevs1 =np.arange(-200,100,10)

cs1 = plt.contourf(x,y,z,clevs)

cbar = plt.colorbar(cs1, orientation="horizontal")
cbar.set_ticks(clevs1[::1])

plt.show()

示例图片

如果您有任何建议,将不胜感激 - 我相信这应该相当简单...

3个回答

12
这是Matplotlib 3.4(很可能也适用于较早版本)中旋转刻度标签的惯用方式。
cbar.ax.tick_params(rotation=45)

1
这比被接受的答案好多了。很容易想象一种情况,即等高线级别不容易访问,但cbar对象是可访问的。此外,我不应该“需要”知道刻度位置来旋转标签。 - pretzlstyle

9

如果您对刻度位置和标签感到满意,只想要将其旋转:

cbar.ax.set_xticklabels(cbar.ax.get_xticklabels(), rotation='vertical')

6
您可以使用cbar.ax.set_xticklabels来更改旋转角度(如果您有一个垂直的颜色条,则使用set_yticklabels)。
cbar.ax.set_xticklabels(clevs1[::1],rotation=90)

这里输入图片描述

编辑:

为了正确设置刻度,您可以使用np.argminclevs1数组中搜索第一个刻度应该在哪里,并在set_xticklabels时使用该索引来索引clevs1

tick_start = np.argmin(abs(clevs1-clevs[0]))
cbar.ax.set_xticklabels(clevs1[tick_start:],rotation=90)

enter image description here


我已经看过这个了,但它会使刻度标签不正确。 - Kieran Hunt
他们应该是什么?你有一个范围从-200到90的“clevs1”,但你的示例范围是从-100到0? - tmdavison
标签是否应与实际等高线级别不同?最好使用vminvmax来控制在色条上显示的范围。 - tmdavison
正确的值为-100到0;clevs1是(假设我们不知道绘制数据的范围)可用作刻度标签的可接受值列表。 - Kieran Hunt
@KieranHunt 好的,这只是找到clevs1中与clevs最低值对应的第一个值的问题。请查看我的编辑以了解如何实现。 - tmdavison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接