python-3.x - 按值类别着色条形图
问题描述
我需要按值的类别为我的条形图着色。这可能使用 Matplotlib 吗?
示例:通常我使用两个列表来创建条形图: values = [5, 2, 1, 7, 8, 12] xticks = [John, Nina, Darren, Peter, Joe, Kendra]
是否可以添加一个额外的类别列表,并根据这些类别为这些栏着色?喜欢:类别= [男,女,男,男,男,女]
提前致谢!
解决方案
如果需要,您可以将数据构造为字典,然后可以这样解决,其中每个条目作为属性“性别”,这也是字典中的查找键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()
有多种方法可以在这里获得有效的“男性”/“女性”图例;一种是创建一个完全自定义的图例。例如,您可以将 dict 分为一个用于男性数据和一个用于女性数据,然后创建两个单独的条形图,例如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"]
. 这样我们就可以轻松地创建两个单独的条形图。
推荐阅读
- collections - JAVA 中 currentTimeMillis() 的意外行为
- java - 有没有更简单的方法来计算 Java 中的面额?
- java - 我有这个问题,我需要使用堆栈反转第一个单词和第三个单词并交换反转单词的位置
- r - 将矩阵存储为字符而不是二进制 R
- javascript - 带有 html5 视频的慢速页面
- python - 在Python中使用递归将输入数字的数字相加
- django - 如何将我的表单应用于 django 中的多个模板
- android - 将 android app bundle 上传到 playstore 时出错。您的 app bundle 以无法识别的语言 jp 为目标
- firebase - 在 instagram、snapchat、facebook 等 Flutter 应用中实现添加好友功能
- python-3.x - 转换时间戳的时区的好方法是什么?