【问题标题】:Coloring bar chart by category of the values按值类别着色条形图
【发布时间】:2019-04-15 17:46:25
【问题描述】:

我需要按值的类别为我的条形图着色。使用 Matplotlib 可以吗?

示例: 通常我使用两个列表来创建条形图: 值 = [5, 2, 1, 7, 8, 12] xticks = [约翰、妮娜、达伦、彼得、乔、肯德拉]

是否可以添加额外的类别列表,并根据这些类别为这些栏着色? 喜欢: 类别= [男,女,男,男,男,女]

提前致谢!

【问题讨论】:

  • 是的,但是您希望如何完成着色?一个类别的每个成员是否应该具有相同的颜色...? (那为什么不把它们组合在一起呢?)

标签: python-3.x matplotlib


【解决方案1】:

如果您愿意,您可以将数据构建为字典,然后可以这样解决,其中每个条目作为属性“性别”,这也是字典 color_map 中的查找键:

import matplotlib.pyplot as plt

fig,ax=plt.subplots(1,1)

data={
    0:{"name":"John",   "value":5, "gender":"male"},
    1:{"name":"Nina",   "value":2, "gender":"female"},
    2:{"name":"Darren", "value":1, "gender":"male"},
    3:{"name":"Peter",  "value":7, "gender":"male"},
    4:{"name":"Joe",    "value":8, "gender":"male"},
    5:{"name":"Kendra", "value":12,"gender":"female"},
}

color_map={"male":"b","female":"r"}

xs=data.keys()
ys=[v["value"] for v in data.values()]
names=[v["name"] for v in data.values()]
colors=[color_map[v["gender"]] for v in data.values()]

ax.bar(xs,ys,color=colors)

ax.set_xticks(xs)
ax.set_xticklabels(names)
plt.show()

这里有多种方法可以获得有效的“男性”/“女性”图例;一种是创建一个fully custom legend。例如,您可以将字典分成一个用于男性数据和一个用于女性数据,然后创建两个单独的条形图,例如ax.bar(… , label="male"),但这是一种臃肿的方法。

我建议使用 pandas 库,然后将我的答案更改为:

import matplotlib.pyplot as plt
import pandas as pd

fig,ax=plt.subplots(1,1)

data={
    0:{"name":"John",   "value":5, "gender":"male"},
    1:{"name":"Nina",   "value":2, "gender":"female"},
    2:{"name":"Darren", "value":1, "gender":"male"},
    3:{"name":"Peter",  "value":7, "gender":"male"},
    4:{"name":"Joe",    "value":8, "gender":"male"},
    5:{"name":"Kendra", "value":12,"gender":"female"},
}

df=pd.DataFrame.from_dict(data,orient='index')

color_map={"male":"b","female":"r"}
df["colors"]=df["gender"].map(color_map)

for g in ["male","female"]:
    xs=df.index[df["gender"]==g]
    ys=df["value"][df["gender"]==g]
    color=df["colors"][df["gender"]==g]
    ## or, perhaps easier in this specific case: 
    #  color=color_map[g]

    ax.bar(xs,ys,color=color,label=g)

ax.legend()
ax.set_xticks(df.index)
ax.set_xticklabels(df["name"])

plt.show()

在这里,关键是我们可以在各种条件下过滤数据框df(可能认为它像 Excel 工作表),例如df["value"][df["gender"]=="male"]。这样我们就可以轻松创建两个单独的条形图。

【讨论】:

  • 绘制条形图。
  • @gmds 这不正是问题所推断的吗?请参阅:“按值类别着色条形图”、“我需要为条形图着色..”……?
  • 谢谢@Asmus,这正是我所需要的!这里还有一个问题,是否可以根据类别创建图例,在本例中为“性别”?
  • @Asmus 我经常使用 pandas,我更喜欢你的第二个解决方案,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-05-15
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
相关资源
最近更新 更多