Как создать столбчатую диаграмму с накоплением для информационного кадра, содержащего отдельные состояния открытия / закрытия? - PullRequest
2 голосов
/ 15 января 2020

Я хочу построить столбчатую диаграмму с накоплением, где состояние находится на оси x, а в столбцах каждого состояния отображаются открытые и закрытые пропорции. У меня есть что-то вроде этого

import matplotlib.pyplot as plt
import pandas as pd

# it's dataframe
state  complaints_status
 a         closed
 b         closed
 c         open
 a         closed
 a         open
 e         open

Я пытался решить это, но это не работает

states = list(complaints_df.State.unique())
closed = []
opened = []
def status(state):
    if 'Closed' in complaints_df[complaints_df['State'] == state]['Complaints_status'].value_counts():
        closed.append(complaints_df[complaints_df['State'] == state]['Complaints_status'].value_counts()['Closed'])
    if 'Open' in complaints_df[complaints_df['State'] == state]['Complaints_status'].value_counts():
        opened.append(complaints_df[complaints_df['State'] == state]['Complaints_status'].value_counts()['Open'])
for state in states:
    status(state)

# plotting stack bar chart
indx = list(range(len(states)))
plt.figure(figsize=(12,8))
graph_state = plt.bar(x=indx, height=states, width=0.35)
graph_closed = plt.bar(x=indx, height=closed, width=0.35, bottom=states)
graph_opened = plt.bar(x=indx, height=opened, widht = 0.35, bottom=closed+states)
plt.xlabel('States')
plt.ylabel('Complaints')
plt.show()

Я понимаю, что это неправильно, поскольку это не точно отображает то, какое состояние есть открытые и закрытые жалобы, так как я должен решить это

1 Ответ

1 голос
/ 15 января 2020

Это может сработать. Сначала я создал несколько случайных данных для тестирования.

Затем:

  • groupby (['state', messages_status ']). Size ():
    • groups за состояние и за состояние и рассчитывает, принимая размер
  • ... .unstack ():
    • для преобразования двух строк для каждого состояния в одну строку с отдельным столбцы для открытых и закрытых
  • ... .fillna (0):
    • , когда в каком-либо состоянии есть ноль открытых или закрытых жалоб, .size дал Not a Number, замените с нулями
  • ... .plot (kind = 'bar', stacked = True)
    • создать сюжет
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

states = ['Maryland','Georgia','Michigan','California','NewMexico','Indiana','Virginia','Illinois','Pennsylvania','Massachusetts','Oregon','Texas','NewHampshire','Minnesota','Tennessee','Colorado','Florida','Alabama','Washington','NewYork','NewJersey','Maine','Missouri','WestVirginia','Montana','Mississippi','Connecticut','Vermont','Kentucky','SouthCarolina','Ohio','Utah','Delaware','Arkansas','Nevada','Louisiana','Kansas','Arizona','North Carolina','Rhode Island','District of Columbia','Iowa']
status_options = ["open", "closed"]
num_states = len(states)

N = 300
# create a random list of states (with repitition)
complaints_states = np.random.choice(states, N)
# generate random status, with a little higher probability for "closed"
complaints_status = np.random.choice(status_options, N, p=[0.3, 0.7])
# create a dataframe
complaints_df = pd.DataFrame({'state': complaints_states, 'complaints_status': complaints_status})

# create the plot
complaints_df.groupby(['state', 'complaints_status']).size().unstack().fillna(0).plot(kind='bar', stacked=True)
plt.xlabel('')  # remove unnecessary 'state' label
plt.ylabel('Number of Complaints')
plt.tight_layout()
plt.show()

generated plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...