如何使用Matplotlib在一个栏中比较两个数据系列

时间:2019-06-28 15:41:23

标签: python pandas matplotlib bar-chart data-science

我想比较幸存者的人数与性别。 我有类似的东西:

Name, Survived, Sex
John, 0, male
Ana, 1, female
Leo, 1, male
Peter, 0, male

并尝试创建如下所示的条形图: https://pythonspot.com/wp-content/uploads/2015/07/barchart_python.png.webp

我尝试过这种方式

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

data = pd.read_csv('titanic_data/train.csv')


figure1 = plt.bar(range(4), data[data['Sex']=='male']['Survived'].value_counts(), label='Male')
figure2 = plt.bar(range(4), data[data['Sex']=='female']['Survived'].value_counts(), label='Female')
plt.legend()
plt.xticks(np.arange(4), rotation=0)
plt.title("Third class survivors")

plt.show()

但是它显示“ ValueError:形状不匹配:对象无法广播为单个形状”。我该怎么办?

2 个答案:

答案 0 :(得分:1)

有两个问题:

首先:在读取csv文件中的值时,列名中包含多余的空格。要摆脱这些限制,您可以使用skipinitialspace=True

第二:您使用range(4)绘制条形图,而男性和女性类别只有两个条形图。结果,您得到"ValueError: shape mismatch。因此,最好使用男女计数的长度

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

data = pd.read_csv('titanic_data/train.csv', skipinitialspace=True)

males = data[data['Sex']=='male']['Survived'].value_counts()
females = data[data['Sex']=='female']['Survived'].value_counts()

figure1 = plt.bar(range(len(males)), males, align='edge', width=0.4, label='Male')
figure2 = plt.bar(range(len(females)), females, align='edge', width=-0.4, label='Female')
plt.legend()
plt.xticks(np.arange(len(males)), rotation=0)
plt.title("Third class survivors")

plt.show()

enter image description here

答案 1 :(得分:0)

您还可以将groupby方法与示例数据一起使用:

Name, Survived, Sex
John, 0, male
Ana, 1, female
Leo, 1, male
Peter, 0, male
df.groupby(by=' Sex')[' Survived'].plot.hist()
plt.xticks([0, 1])
plt.legend()

产生:

enter image description here