Как я могу отладить эту проблему с построением графика?

#python #pandas #dataframe #matplotlib

#python #панды #фрейм данных #matplotlib

Вопрос:

Столбцы:

 Company

Location

DateTime

Details
 

Результат: сбой перед запуском / частичный сбой / сбой / успех

Напишите программу для выполнения следующих действий:

  1. Создайте круговой график, который показывает распределение результатов миссии.
  2. Создайте график с горизонтальной полосой, показывающий общее количество миссий для каждой компании, с наибольшим количеством вверху и наименьшим количеством внизу.
  3. Создайте тот же график с горизонтальной полосой, но с миссиями, сгруппированными по успеху и неудаче, с успехом в зеленом и неудачей в красном.

Для 3. Я должен получить график, как показано ниже:

введите описание изображения здесь

Но я получаю следующее:

введите описание изображения здесь

Я не понимаю, что я делаю не так, как я могу это исправить? Вот мой код:

 import pandas as pd
import matplotlib.pyplot as plt

#Read the data file into dataframe
df = pd.read_csv("data.csv")

#Length of dataframe
total = len(df)

#Success percentage
success = (len(df[df['Outcome'] == 'Success'])/total) * 100 

#Failure percentage
failure = (len(df[df['Outcome'] == 'Failure'])/total) * 100

#Partial failure percentage
partial_failure = (len(df[df['Outcome'] == 'Partial Failure'])/total) * 100 

#Prelaunch failure percentage
prelaunch_failure = (len(df[df['Outcome'] == 'Prelaunch Failure'])/total) * 100 

dict_1 = {} 

# Iterate through company column
for k in df['Company']: 
    if k in dict_1: 
        dict_1[k]  = 1
    else:
        dict_1[k] = 1

sorted_dict = {}

#Sort dictionary
sorted_keys = sorted(dict_1, key=dict_1.get, reverse=True) 

for w in sorted_keys:
    
# Add sorted values in the new dictionary
  sorted_dict[w] = dict_1[w] 

dict_3 = {} 
dict_4 = {} 

#Iterate through unique Companies
for c in df['Company'].unique(): 
    failure = 0 

#Get only the outcome column of each company
    comp_proj = df.loc[df['Company'] == c, 'Outcome'] 
    for h in comp_proj: 
        if h == 'Failure' or h == 'Partial Failure' or h == 'Prelaunch Failure':
            failure = failure   1
dict_3[c] = failure   
dict_2 = {} 
for l in dict_2.keys(): 
    dict_4[l] = dict_3[l]

# Plot Pie Chart
figure1, ax1 = plt.subplots(figsize=(10,15))
status = [success,failure,partial_failure,prelaunch_failure]
label = ["success","failure","partial","prelaunch"]
ax1.pie(status,labels=label)
ax1.set_ylabel("Outcome")
plt.savefig('plot 1.png')

# Plot the first bar chart
figure2, ax2 = plt.subplots(figsize=(15,15))
ax2.barh(range(len(sorted_dict)), sorted_dict.values(), align='center')
ax2.set_yticks(range(len(sorted_dict)))
ax2.set_yticklabels(sorted_dict.keys())
ax2.set_ylabel("Company")
ax2.invert_yaxis()
plt.savefig('plot 2.png')

# Plot the second bar chart
figure3, ax3 = plt.subplots(figsize=(15,15))
ax3.barh(range(len(sorted_dict)), sorted_dict.values(), align='center', color='green')
ax3.barh(range(len(dict_4)), dict_4.values(), align='center', color='red')
ax3.set_yticks(range(len(sorted_dict)))
ax3.set_yticklabels(sorted_dict.keys())
ax3.set_ylabel("Company")
ax3.legend(["Success", "Failure"])
ax3.invert_yaxis()  
plt.savefig('plot 3.png')
 

Образец данных:

введите описание изображения здесь

Комментарии:

1. Пожалуйста, поделитесь базовыми данными (их образцом). В противном случае очень сложно проверить, что вы сделали.

2. Просто поделился частью данных для вашего удобства.

3. строка с отступом «dict_3 [c] = сбой» должна решить проблему.

4. @SAL Я так не думаю, это ничего не изменило. :/

5. dict_4, который вы используете для управления красными полосами, ничего не содержит. Вы устанавливаете dict_2 пустым, затем заполняете dict_4, используя пустой набор ключей. Вам нужно распечатать ваши промежуточные значения, чтобы убедиться, что они соответствуют вашим ожиданиям.