Создание гистограммы, показывающей процентное изменение от вершины бара - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь создать столбчатую диаграмму степеней, присуждаемых колледжами, которая показывает две вещи: первая полоса должна отображать общий процент степеней, присуждаемых в прошлом году, а затем столбцы 2, 3 и 4 должны отображать процентРазница между степенями, присуждаемыми 5/10/15 лет назад.

Я могу представить их как все, начиная с 0. Но есть ли способ выровнять разницу в процентах по y = вершине текущего общего процента(столбец 1), а не y = 0?

График, который я создал сейчас, таков (с использованием основных панд df.plot(kind = 'bar'):

bar_chart_all_y_0

То, что я хочу сделать, это переместить желтую, зеленую и красную полосы (которые показывают изменения с шагом 5, 10, 15 лет) так, чтобы они начинали выравниваться с вершиной синих полос (в крайнем левом углу).каждой группы).

Я прочитал следующие темы:

Как создать гистограмму, которая начинается и заканчивается в определенном диапазоне

100% столбчатая диаграмма в MatPlotLib

Питон с водопадом?

, но я не уверен, как составить точный график, который я хочу создать.

Огромное спасибо.

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Используя базовый пример 2 колледжа, я сделал то, что вы хотели, суммируя различия в поступлении из года в год поверх абсолютных значений этих поступлений. Если вы делаете это для нескольких колледжей, очевидно, что вы захотите сделать это в цикле, чтобы вам не приходилось явно создавать каждый бар. Это решение должно дать вам инструменты, необходимые для создания того, что вы хотите. Я бы добавил, что в качестве средства сбора информации я не считаю этот график очень полезным. Лично я просто представляю поступление из года в год и позволяю глазам понять, насколько они разные, или наклеить ярлыки, которые обозначают разницу между годами.

import pandas as pd
from matplotlib import pyplot as plt

df = pd.DataFrame({'college1' : [0.14, 0.1, 0.12, 0.07],
                        'college2' : [0.14, 0.16, 0.18, 0.12]}).T
df.columns = ['today', '5years', '10years', '15years']
width = 0.5

#plot the today bars
p1 = plt.bar([1, 4], df['today'], width, color =['#0247fe', '#175d1e'])

#plot the difference bars
p2 = plt.bar([1.5, 4.5], df['today']- df['5years'], width,
             bottom=df['5years'], color=['#6363ff', '#427741'])
p3 = plt.bar([2, 5], df['today']- df['10years'], width,
             bottom = df['10years'], color = ["#8d81ff", "#679164"])
p4 = plt.bar([2.5, 5.5], df['today']- df['15years'], width,
             bottom = df['15years'], color=["#ae9fff", "#8cac88"])

#other controls
plt.xticks([1.25, 1.75, 2.25, 2.75, 4.25, 4.75, 5.25, 5.75], ['c1 today', '5yearDiff', '10yearDiff', '15yearDiff','c2 today', '5yearDiff', '10yearDiff', '15yearDiff'],
                                                                                        rotation='vertical')
plt.ylabel("Admissions")
plt.ylim(0, 0.2)
plt.xlim(0.75, 6)
plt.gcf().set_size_inches(8, 8)
plt.subplots_adjust(bottom=0.2)
plt.show()

enter image description here

1 голос
/ 16 апреля 2019

Я бы подумал просто сделать это в Matplotlib.

См .: https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html

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

Вы можете увидеть его использование в одном из их примеров здесь: https://matplotlib.org/gallery/lines_bars_and_markers/bar_stacked.html#sphx-glr-gallery-lines-bars-and-markers-bar-stacked-py

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