Гистограмма Matplotlib - оверлейные бары, похожие на сложенные - PullRequest
0 голосов
/ 04 января 2019

Я хочу создать гистограмму matplotlib, которая выглядит как сложенный график, не будучи аддитивной из мультииндексного пандаша.

Приведенный ниже код дает базовое поведение

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import io

data = io.StringIO('''Fruit,Color,Price
Apple,Red,1.5
Apple,Green,1.0
Pear,Red,2.5
Pear,Green,2.3
Lime,Green,0.5
Lime, Red, 3.0
''')
df_unindexed = pd.read_csv(data)
df_unindexed
df = df_unindexed.set_index(['Fruit', 'Color'])
df.unstack().plot(kind='bar')

Команда plot df.unstack().plot(kind='bar') показывает все цены на яблоки, сгруппированные рядом друг с другом.Если вы выберете опцию df.unstack().plot(kind='bar',stacked=True) - она ​​сложит вместе цены на красный и зеленый и сложит их.

Мне нужен график, который находится на полпути между двумя - он показывает каждую группу как один столбец, но накладывает значения, чтобы вы могли видеть их все.На приведенном ниже рисунке (сделано в powerpoint) показано, какое поведение я ищу -> мне нужно изображение справа.

Если не считать вычисления всех значений и затем использовать опцию с накоплением, возможно ли это?

example bar plot

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Есть две проблемы с этим типом сюжета.(1) Что, если фоновая полоса меньше, чем передняя панель?Это было бы просто скрыто и не видно.(2) Такая диаграмма не отличается от гистограммы с накоплением.У читателей будут серьезные проблемы с интерпретацией.

При этом вы можете построить оба столбца по отдельности.

import matplotlib.pyplot as plt
import pandas as pd
import io

data = io.StringIO('''Fruit,Color,Price
Apple,Red,1.5
Apple,Green,1.0
Pear,Red,2.5
Pear,Green,2.3
Lime,Green,0.5
Lime,Red,3.0''')

df_unindexed = pd.read_csv(data)
df = df_unindexed.set_index(['Fruit', 'Color']).unstack()
df.columns = df.columns.droplevel()

plt.bar(df.index, df["Red"].values, label="Red")
plt.bar(df.index, df["Green"].values, label="Green")
plt.legend()
plt.show()

enter image description here

0 голосов
/ 04 января 2019

Это кажется (мне) плохой идеей, так как это представление приводит к нескольким проблемам.Понимает ли читатель, что это не ставочные бары?Что происходит, когда передняя панель выше, чем те, что позади?

В любом случае, чтобы выполнить то, что вы хотите, я бы просто неоднократно вызывал plot() для каждого подмножества данных и использовал одни и те же оси, чтобыбары нарисованы друг на друге.В вашем примере «красные» цены всегда выше, поэтому мне пришлось скорректировать порядок, чтобы расположить их сзади, иначе они бы скрывали «зеленые» бары.

fig,ax = plt.subplots()

my_groups = ['Red','Green']
df_group = df_unindexed.groupby("Color")

for color in my_groups:
    temp_df = df_group.get_group(color)
    temp_df.plot(kind='bar', ax=ax, x='Fruit', y='Price', color=color, label=color)

enter image description here

...