我有一本字典,其中包含键作为标签,值包含作为绘图的颜色。以以下示例为例:Change color of specific ticks at plot with matplotlib。如何根据字典中的键更改标签颜色。请注意,标签可以在x轴上重复多次,并且可以是字符串,例如label ='A','B','C','D'。
这里是代码的小修改:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(5,4))
ax.plot([1,2,3])
colors = {0.00 :'grey',0.25:'yellow',0.50:'brown',2.00:'red'}
for k, v in colors.items():
ax.get_xticklabels()[k].set_color(v)
plt.show()
我希望绘图上的每个标签都与一种颜色相关联,但是我得到了一个带有以下错误的普通绘图:TypeError:列表索引必须是整数或切片,而不是浮点数。我正在尝试使其专门适应字符串标签。
答案 0 :(得分:1)
该错误归因于ax.get_xticklabels()
返回一个列表。列表中的元素通过位置(索引,从0开始)而不是值来获取。
词典中的内容是刻度的值,而不是位置。
您需要先提取其位置,然后使用它来设置颜色。我调整了代码来做到这一点:
import numpy as np
import matplotlib.pyplot as plt
def colorticks(event=None):
locs, labels = plt.xticks()
colors = {0.00 :'grey',0.25:'yellow',0.50:'brown',2.00:'red'}
for k, v in colors.items():
idxs = np.where(locs == k)[0]
for pos in idxs:
labels[pos].set_color(v)
fig, ax = plt.subplots(figsize=(5,4))
ax.plot([1,2,3])
colorticks()
#following line is needed to keep the correct colors when resizing
cid = fig.canvas.mpl_connect('resize_event', colorticks)
plt.show()
键为locs, labels = plt.xticks()
:xticks返回带有值(locs
)及其Text对象(labels
)的列表。
然后,numpy.where用于查找循环中每个给定值的索引,并且该索引用于设置Text
对象的颜色。
在@ImportanceOfBeingErnest的评论之后,上面的代码已更新,可以在调整图形大小时使用。
相关行已包装在一个函数中,用作'resize_event'
的回调。
答案 1 :(得分:1)
一种解决方案是检查字典键中是否存在刻度线标签。为了比较确切的值,我将键从float转换为字符串。我相信这对您来说应该不是问题。
P.S .:基于@ImportanceOfBeingEarnest的评论,我要指出的是,此答案假设该图保持不变且未调整大小。
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(5,4))
ax.plot([1,2,3])
colors = {'0.00' :'grey','0.25':'yellow','0.50':'brown','2.00':'red'}
fig.canvas.draw()
for xtic in ax.get_xticklabels():
if xtic.get_text() in colors.keys(): # Change color if exist else not
xtic.set_color(colors[xtic.get_text()])
plt.show()