如何使用Matplotlib.plot实现自定义横纵坐标轴标记(自定义标签与间隔放置)

Matplotlib是数据可视化中使用的各类绘图库中应用较为广泛的一个,近期使用时遇到大批量数据需要自定义坐标轴标记的需求,捣鼓了很久才搞明白,特此记录

如何自定义坐标

创建对象、设置画布后,绘制图形前,使用 Matplotlib.pyplot.xtick(ticks=mytick, labels=my_label)设置

import Matplotlib.pyplot as plt
x = list(range(1100))
y = [1] * 1100

plt.subplots(figsize=(18,6))

plt.xlabel('time')                                      # 设置x坐标轴的名称
my_label = ['I am No.3','I am No.4','I am No.999']      # 自定义坐标轴值
plt.grid(b=True)                                        # 开启网格线
plt.xticks(ticks=[3,14,999],labels=my_label,
    rotation=60, ha='right')                            # 自定义x轴内容
plt.ylabel('whatever')                                  # 设置y坐标轴的名称
plt.plot(x, y)                                          # 画图

上述内容中,plt.xticks(ticks=[3,14,999],labels=my_label,)的ticks与labels长度可以不同,但是不同会导致显示出的标签数目不合预期,使用时需要注意。另外,ticks=labels=可以省略,但省略时顺序不能颠倒,即必须先写坐标显示位置,再写坐标内容。

plt.xticks(rotation=60, ha='right')中的rotation提供坐标标签旋转,旋转中心是标签的中心,所以旋转后可能出现看起来和坐标点对不齐的情况,这时候就需要使用ha参数选择标签的{'left','center','right'}边缘与坐标点对齐。

上述代码的运行效果如图所示:

间隔放置坐标轴标签的方法

正因此处的xticks()可以帮助我们选择放置坐标轴的位置,我们可以巧妙的利用它完成间隔设置标签的需求,只需:

import Matplotlib.pyplot as plt
x = list(range(1100))
y = [1] * 1100

plt.subplots(figsize=(18,6))

plt.xlabel('time')                         # 设置x坐标轴的名称
my_tick = list(range(1100))                # 可以用list(range(len(my_label))) 替代
my_label = time_label[:1100]               # 有1100个时间字符串的list
plt.grid(b=True)                                        
plt.xticks(my_tick[::100],my_label[::100]
    ,rotation=60, ha='right')              # 利用切片来完成需求
plt.ylabel('whatever')                                   
plt.plot(x, y)                                          

上述代码的运行效果如图所示:

如果不加切片,显示效果将是灾难

网上的另一种方法

还有一种网上常见的方法使用matplotlib.pyplot.gca().xaxis.set_major_locator()来调整坐标间隔,但是这种方法调整的是坐标轴上打点的间隔,并不能做到省略某些坐标点。在本文使用的时间字符串time_labellist这种上千坐标标签的情况下,用此方法只会导致前半部分标签被分散打在全长度的坐标轴上,请看代码与截图:

N = 4
tsm4 = TimeSeriesKMeans(n_clusters=N, max_iter=10).fit(two_week_nor)
time_label = two_week.time.to_list()
for clus in range(N):
    plt.subplots(figsize=(18,6))
    plt.xlabel('time')
    plt.xticks(range(len(time_label)),time_label, rotation=-60, ha='left')
    plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(128))
    x = two_week_nor[np.where(tsm4.labels_ == clus)].T
    for item in x:
      plt.plot(item, alpha = 0.6)

可以看到坐标轴只显示了前半部分的连续坐标,并没有做到真正的间隔显示。

posted @ 2021-03-28 10:03  Approid  阅读(16825)  评论(0编辑  收藏  举报