Выделите определенные столбцы на гистограмме - PullRequest
0 голосов
/ 22 октября 2018

У меня есть два кадра данных df1 и df2.df2 является подмножеством df1.Я хочу нарисовать горизонтальный линейный график df1, определив df2 рядов (другой цвет бара или что-то в этом роде).Спасибо.

%matplotlib inline 
import pandas as pd
import matplotlib as plt

d1 = {
    'index' : [1, 2, 3, 4, 5], 
    'col1'  : [5, 8, 6, 4, 2]
}

d2 = {
    'index' : [3, 5], 
    'col1'  : [6, 2]
}

df1 = pd.DataFrame(d1).set_index(["index"])
df2 = pd.DataFrame(d2).set_index(["index"])

df1.plot(kind="barh", grid=False)

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

К сожалению, функция pandas 'barh не позволяет нам выбирать разные цвета для каждой полосы. Но так как это похоже на случай , я бы предпочел , а не использовать функцию построения панд, но вместо этого напрямую использовать функцию matplotlib.

В этом контексте естьмножество способов добиться желаемого результата.Вот один из вариантов:

fig, ax = plt.subplots()
c = ['C2' if i in df2.index else 'C1' for i in df1.index]
ax.barh(y=df1.index,width=df1.col1,color=c)
ax.grid(False)

enter image description here

@ Ответ GlobalTraveler заставил меня задуматься о другом решении

df3 = df1.loc[df1.index.difference(df2.index)].append(df2, sort=False).sort_index()
df3.plot(kind='barh', stacked=True, grid=False)

Первая строка создает новый фрейм данных, который имеет следующее содержимое:

    col1    col2
index       
1   5.0     NaN
2   8.0     NaN
3   NaN     6.0
4   4.0     NaN
5   NaN     2.0

При построении этого фрейма данных получается желаемый результат.enter image description here

0 голосов
/ 22 октября 2018

Я думаю, что путь состоит в том, чтобы объединить кадры данных и добавить nans для пропущенных значений

import pandas as pd
import matplotlib.pyplot as plt

d1 = {
    'index' : [1, 2, 3, 4, 5], 
    'col1'  : [5, 8, 6, 4, 2]
}

d2 = {
    'index' : [3, 5], 
    'col1'  : [6, 2]
}

df1 = pd.DataFrame(d1).set_index(["index"])
df2 = pd.DataFrame(d2).set_index(["index"])

plotThis = pd.concat([df1, df2], axis = 1, ignore_index = True)

plotThis.plot(kind = 'barh')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...