几个小时前我遇到这个问题时,我认为只需要几分钟的谷歌搜索即可解决,但我在这里。
我使用单个plt.bar()调用绘制所有值:
plt.bar(range(len(vals)), vals, width=1, color=colors)
这会创建一个条形图,其中条形图是彩色编码的。当我尝试创建图例时,它只显示一种颜色和一个标签。例如,这样做:
labels = ['Group 1', 'Group 2', 'Group 3']
plt.legend(labels,
loc='best',
ncol=3)
仅在图例上显示“组1”以及多种条形颜色之一。如何向图例添加更多项目?
我知道这个问题是因为我在一个图中分配了多种颜色,但在这种情况下,这是该部分最干净的解决方案。
资源我发现建议使用“ax.get_legend_handles_labels()”,但这会为我返回两个空列表。
编辑:
@falsetru, 下面是一个代码示例,它描述了应用解决方案后的问题。我包括了所有相关部分。
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
items= ['item1','item2','item3'] #item names
vals = [1, 2, 3] #values to be plotted
groups = [['item1','item2'], ['item3']] #defines item groupings
colors = [''] * len(items)
color_space = iter(cm.Paired(np.linspace(0, 1, len(groups))))
for c in groups:
col = next(color_space)
for l in c:
i = items.index(l)
colors[i] = col
for i, (val, c) in enumerate(zip(vals, colors)):
plt.bar([i], [val], width=1, color=c)
labels = ['Group 1', 'Group 2']
plt.legend(labels, loc='best')
plt.show()
这是输出,但我希望第2组显示下一个颜色。
答案 0 :(得分:4)
将vals
(y值),indices
(x值)分组为groups
:
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
indices = [[1, 3], [2], [4]] # <-----
vals = [[1, 2.5], [1.5], [3.5]] # <-----
labels = ['Group 1', 'Group 2', 'Group 3']
color_space = iter(cm.Paired(np.linspace(0, 1, len(vals))))
for xs, ys, label in zip(indices, vals, labels):
col = next(color_space)
plt.bar(xs, ys, width=1, color=col, label=label)
plt.legend(loc='best')
plt.show()