Столбчатая диаграмма 100% в MatPlotLib
Я пытаюсь создать 100-процентную столбчатую диаграмму в MatPlotLib, используя данные системы показателей колледжа с этого сайта.
Есть 38 столбцов, которые являются: Процент присуждаемых степеней в [укажите область обучения здесь] Это объясняет, почему есть 38 полей!
И у меня есть подмножество школ, для которых я хотел бы сделать эту диаграмму с накоплением.
Я пытался следовать инструкциям здесь. Да. Это довольно длинный код, но я хотел сыграть его по книге. (плюс мне всегда везло с этим блогом) Данные пришли с этим PCIP (Процент степеней, присвоенных областью обучения), пришли в процентной форме, поэтому мне не пришлось следовать расчетам Криса, потому что они уже были завершены,
Я получаю ошибки, когда я запускаю код:
bar_width = 1
bar_l = [i for i in range(len(df['PCIP01']))]
tick_pos = [i+(bar_width/2) for i in bar_l]
# Create a figure with a single subplot
f, ax = plt.subplots(1, figsize=(10,5))
ax.bar(bar_l,
degrees.PCIP01,
label='PCIP01',
alpha=0.9,
color='#2D014B',
width=bar_width
)
ax.bar(bar_l,
PCIP04,
label='PCIP04',
alpha=0.9,
color='#28024E',
width=bar_width
)
[и так далее, и так далее для всех оставшихся 36 полей
# Set the ticks to be School names
plt.xticks(tick_pos, degrees['INSTNM'])
ax.set_ylabel("Percentage")
ax.set_xlabel("")
# Let the borders of the graphic
plt.xlim([min(tick_pos)-bar_width, max(tick_pos)+bar_width])
plt.ylim(-10, 110)
# rotate axis labels
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
# shot plot
И это была ошибка, которую я получил:
ValueError Traceback (most recent call last)
<ipython-input-91-019d33be36c2> in <module>()
7 alpha=0.9,
8 color='#2D014B',
----> 9 width=bar_width
10 )
11 ax.bar(bar_l,
C:\Users\MYLOCATION\Anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, *args, **kwargs)
1889 warnings.warn(msg % (label_namer, func.__name__),
1890 RuntimeWarning, stacklevel=2)
-> 1891 return func(ax, *args, **kwargs)
1892 pre_doc = inner.__doc__
1893 if pre_doc is None:
C:\Users\MYLOCATION\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in bar(self, left, height, width, bottom, **kwargs)
2077 if len(height) != nbars:
2078 raise ValueError("incompatible sizes: argument 'height' "
-> 2079 "must be length %d or scalar" % nbars)
2080 if len(width) != nbars:
2081 raise ValueError("incompatible sizes: argument 'width' "
ValueError: incompatible sizes: argument 'height' must be length 38678 or scalar
Может ли кто-нибудь помочь мне упростить этот код, чтобы я мог создать эту стопроцентную гистограмму?
1 ответ
Во-первых, в этом наборе данных много университетов, может быть, построение гистограммы не самая лучшая идея?
В любом случае, вы можете пройтись по каждому типу степени и добавить еще один бар. Чтобы создать столбец с накоплением, вы просто меняете нижнюю позицию каждого столбца.
import pandas as pd
import matplotlib.pyplot as plt
from cycler import cycler
import numpy as np
df = pd.read_csv('scorecard.csv')
df = df.ix[0:10]
degList = [i for i in df.columns if i[0:4]=='PCIP']
bar_l = range(df.shape[0])
cm = plt.get_cmap('nipy_spectral')
f, ax = plt.subplots(1, figsize=(10,5))
ax.set_prop_cycle(cycler('color',[cm(1.*i/len(degList)) for i in range(len(degList))]))
bottom = np.zeros_like(bar_l).astype('float')
for i, deg in enumerate(degList):
ax.bar(bar_l, df[deg], bottom = bottom, label=deg)
bottom += df[deg].values
ax.set_xticks(bar_l)
ax.set_xticklabels(df['INSTNM'].values, rotation=90, size='x-small')
ax.legend(loc="upper left", bbox_to_anchor=(1,1), ncol=2, fontsize='x-small')
f.subplots_adjust(right=0.75, bottom=0.4)
f.show()
Вы можете изменить этот код, чтобы получить именно то, что вы хотите (например, кажется, что вам нужен процент, а не дробь, поэтому просто умножьте каждый столбец градусов на 100). Для тестирования я взял первые 10 университетов, результаты которых приведены на этом графике:
С 10 университетами это уже довольно занятый сюжет - с 100 университетами это практически не читается:
Я могу гарантировать, что с почти 8000 университетами этот составной план будет совершенно нечитаемым. Может быть, рассмотреть другой способ представления данных?