Matplotlib标签重叠

时间:2016-11-18 18:22:21

标签: python matplotlib

我有一个图像,其中每列都有一个关联的属性。我想绘制图像并用其属性值标记每列。这是一个显示我的意思的简单代码:

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标签行为?

重叠标签

enter image description here

默认行为

enter image description here

1 个答案:

答案 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)

custom tick labels

当然,这个标签对您的样本数据没有任何意义。我确信你的实际用例有更好的方法,无论它是什么。