matplotlib条形图中的两个图例

时间:2018-08-20 16:44:04

标签: python matplotlib

我的问题与matplotlib two legends out of plot非常相似。有一个答案适用于常见的线图。
复制条形图的解决方案时遇到问题...
 问题是,在给定的解决方案l1l2,...为<matplotlib.lines.Line2D中,如果我对bar-plot做同样的技巧,它无法推断颜色...

enter image description here

代码:

import matplotlib.pyplot as plt
import numpy as np

bar_data_cost = np.random.rand(4,11)
bar_data_yield =  np.random.rand(4,11)
cmap_yield = plt.cm.Greens(np.linspace(0.2, 1, len(bar_data_cost)))
cmap_costs = plt.cm.Oranges(np.linspace(0.2, 1, len(bar_data_cost)))

fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(20,8))

ax1 = axes
y_offset_yield = np.zeros(len(bar_data_yield[0]))
y_offset_cost = np.zeros(len(bar_data_cost[0]))
index1 = np.arange(len(bar_data_yield[1])) - 0.2
index2 = np.arange(len(bar_data_yield[1])) + 0.2

for row in range(len(bar_data_yield)):
    b1 = ax1.bar(left=index1, width=0.4, height=bar_data_yield[row], bottom=y_offset_yield, color=cmap_yield[row])
    y_offset_yield = bar_data_yield[row]

for row in range(len(bar_data_yield)):
    b2 = ax1.bar(left=index2, width=0.4, height=bar_data_cost[row], bottom=y_offset_cost, color=cmap_costs[row])
    y_offset_cost = bar_data_cost[row]


fig.legend(b1, grouped_dataset.index.levels[0], fontsize=16, loc="upper right")
fig.legend(b2, grouped_dataset.index.levels[0], fontsize=16, loc="center right")

1 个答案:

答案 0 :(得分:3)

当前,您的图例仅输出use std::collections::HashMap; enum SomeEnum { A {}, B {}, C {}, } fn main() { let mut hm = HashMap::new(); hm.insert("foo".to_string(), SomeEnum::A {}); hm.insert("bar".to_string(), SomeEnum::B {}); hm.insert("zoo".to_string(), SomeEnum::C {}); } 循环中的最后一个 b1 b2 ,因为它们在每次迭代时都会重新分配。在发布的链接中,在for的第一个参数中传递了一行元组。因此,在反复附加小节之后,将{em> b1 的列表和 b2 的列表传递到legend调用中。

下面用播种的数据演示可重复性,并替换您的legend,因为您的帖子中未知。

grouped_dataset.index.levels[0]

Plot Output