如何使用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_label
list这种上千坐标标签的情况下,用此方法只会导致前半部分标签被分散打在全长度的坐标轴上,请看代码与截图:
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)
可以看到坐标轴只显示了前半部分的连续坐标,并没有做到真正的间隔显示。