Как сравнить два ряда данных в одном баре с помощью matplotlib - PullRequest
2 голосов
/ 28 июня 2019

Я хочу сравнить количество выживших с полом.У меня есть что-то вроде:

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 ]

1 голос
/ 28 июня 2019

Есть две проблемы:

Первое: у вас есть лишние пробелы в именах столбцов при чтении значений из файла CSV.Чтобы избавиться от них, вы можете использовать skipinitialspace=True

Second: вы используете 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

0 голосов
/ 28 июня 2019

Вы также можете просто использовать метод 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

...