根据字典matplotlib中的值更改标签颜色

时间:2019-06-17 15:26:23

标签: python matplotlib

我有一本字典,其中包含键作为标签,值包含作为绘图的颜色。以以下示例为例: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:列表索引必须是整数或切片,而不是浮点数。我正在尝试使其专门适应字符串标签。

2 个答案:

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

enter image description here

键为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()

enter image description here