Matplotlib中为单个刻度线指定自定义颜色的实现问题
问题原因与解决方法
你的代码失效主要有两个原因:
ax1.get_xticklines()会返回每个刻度的上下两条线(比如x=0对应顶部、底部各一条刻度线),实际返回的列表长度是12,而你的colors只有6个元素,zip后只会给前6条线分配颜色,剩下的6条还是默认色;而且这种配对方式会把同一个刻度的两条线分配成不同颜色,完全不符合需求。- 直接修改
tick._color是操作matplotlib的内部私有属性,这种方式不被官方推荐,还可能因版本更新失效,应该用公开的set_color()方法。
正确实现代码
import numpy as np import matplotlib.pyplot as plt x = [0, 1, 2, 3, 4, 5] y = np.sin(x) y2 = np.tan(x) fig = plt.figure() ax1 = fig.add_subplot(2, 1, 1) ax1.plot(x, y) ax2 = fig.add_subplot(2, 1, 2) ax2.plot(x, y2) colors = ['b', 'g', 'r', 'c', 'm', 'y'] ax1.set_xticks(x) # 获取所有x轴刻度线,每两个为一组(对应一个刻度的上下线) tick_lines = ax1.get_xticklines() for i in range(len(colors)): # 给同一个刻度的两条线设置相同颜色 tick_lines[2*i].set_color(colors[i]) tick_lines[2*i + 1].set_color(colors[i]) plt.show()
简化版(仅修改底部刻度线)
如果顶部刻度线默认隐藏,只需要修改底部的刻度线,可以直接取底部的线列表和colors配对:
import numpy as np import matplotlib.pyplot as plt x = [0, 1, 2, 3, 4, 5] y = np.sin(x) y2 = np.tan(x) fig = plt.figure() ax1 = fig.add_subplot(2, 1, 1) ax1.plot(x, y) ax2 = fig.add_subplot(2, 1, 2) ax2.plot(x, y2) colors = ['b', 'g', 'r', 'c', 'm', 'y'] ax1.set_xticks(x) # 只获取底部的刻度线(索引从1开始,步长为2) bottom_ticks = ax1.get_xticklines()[1::2] for tick, color in zip(bottom_ticks, colors): tick.set_color(color) plt.show()
内容的提问来源于stack exchange,提问作者HWIK
相关产品推荐
相关产品推荐

