我有一个图像,其中每列都有一个关联的属性。我想绘制图像并用其属性值标记每列。这是一个显示我的意思的简单代码:
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage.filters import gaussian_filter
np.random.seed(200)
cols = 600
attr = list('abcdefghijklmnopqrstuvwxyz') * cols
attr = labels[:cols]
img = gaussian_filter(np.random.rand(400, cols), 100)
plt.imshow(img, cmap='inferno')
plt.xticks(np.arange(cols), attr)
plt.show()
下面生成的图像显示了X标签的混乱程度。我想要的是显示一些标签,这些标签在与绘图交互时会更新,例如缩放和平移。
我认为这是可能的原因是因为maplotlib的默认行为是正确的(当没有设置xticks时)。它以间隔显示列号,因此标签不重叠,并在缩放时更新。声像。
所以,我的问题是:是否可以使用自定义标签获取默认的matplotlib标签行为?
答案 0 :(得分:3)
您想要的是tick formatting。在这种情况下,您可以创建FuncFormatter
的实例并将其分配给主要刻度。
首先,您需要在导入中添加FuncFormatter
:
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
import numpy as np
from scipy.ndimage.filters import gaussian_filter
您需要一个获取刻度值及其位置并返回刻度标签的函数。你不需要这里的位置,但无论如何它将被传递给函数。确保该函数可以处理意外的滴答值(我使用了matplotlib 2.0.0b4,并在600处打勾)。
cols = 600
letters = list('abcdefghijklmnopqrstuvwxyz')
attr = (letters * (1 + cols // len(letters)))[:cols]
def format_tick(labels):
def get_label(x, pos):
try:
return labels[int(round(x))]
except IndexError:
return ''
return get_label
使用您的格式函数创建FuncFormatter
实例:
formatter = FuncFormatter(format_tick(attr))
将formatter
设置为您的绘图的主要格式化程序:
rs = np.random.RandomState(seed=200)
img = gaussian_filter(rs.rand(400, cols), 100)
plt.imshow(img, cmap='inferno')
plt.gca().xaxis.set_major_formatter(formatter)
当然,这个标签对您的样本数据没有任何意义。我确信你的实际用例有更好的方法,无论它是什么。