matplotlib.pyplot не числовой barplot - PullRequest
0 голосов
/ 19 марта 2019

У меня есть 2 вопроса

Во-первых, есть ли способ составить диаграмму (unstacked) этого фрейма данных, когда я получаю "Пустой" DataFrame ': нет числовых данных для построения "?

df=pd.DataFrame({'midterm':['A','B','B','D'],'Final':['C','A','D','B']}, index=['math', 'sport', 'History', 'Physics'])

Второй вопрос: я вручную отображаю данные на фрейме данных, например

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df=pd.DataFrame({'midterm':['A','B','B'],'Final':['C','A','D']}, index=['math', 'sport', 'History'])

fig, ax = plt.subplots()
index = np.asarray([1,10])
width=0.5
plt.bar(index, df.iloc[0,:], width,label='Math')
plt.bar(index+width, df.iloc[1,:], width, label='Sport')
plt.bar(index+2*width, df.iloc[2,:], width, label='History')
xticks=['midterm','final']
plt.xticks=(index,xticks)
plt.legend()
plt.show()

То, что выдает код, находится здесь

У этого есть две проблемы, - во-первых, A, B, C, D не упорядочены - во-вторых, ось y начинается в точке 0,0, что делает планку сорта C на этом графике вообще не видимой

что я хочу сделать, этоздесь

1 Ответ

0 голосов
/ 19 марта 2019

Я отвечу на ваш второй вопрос.Вы должны ограничить свой вопрос одним запросом.Я бы отобразил оценки на целые числа, а затем установил бы y-галочки.Для этого я определяю словарь сопоставления и функцию mapping, которая берет алфавитные оценки и преобразует их в целочисленные значения для высоты линейчатого графика.

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

df=pd.DataFrame({'midterm':['A','B','B'],'Final':['C','A','D']}, index=['math', 'sport', 'History'])
map_dict = {'A': 1, 'B': 2, 'C': 3, 'D':4}

def mapping(keys):    
    values = [map_dict[i] for i in keys]
    return values

fig, ax = plt.subplots()
index = np.asarray([1,10])
width=0.5
plt.bar(index, mapping(df.iloc[0,:]), width,label='Math')
plt.bar(index+width, mapping(df.iloc[1,:]), width, label='Sport')
plt.bar(index-width, mapping(df.iloc[2,:]), width, label='History')
xticks=['midterm','final']
ax.set_yticks(range(1, 5))
ax.set_yticklabels(map_dict.keys())
plt.legend()

enter image description here

...