горизонтальная гистограмма с цветной полосой непосредственно из объекта pandas кадра данных

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

from matplotlib import pyplot as plt
from matplotlib import cm
import pandas as pd
import numpy as np

# generate dataframe
df = pd.DataFrame(np.random.randn(1000, 4), index=pd.date_range('1/1/2000', periods=ndays), columns=list('ABCD'))
df = df.cumsum()

# plot dataframe
df.plot(figsize=(10,5))

# TODO
# make a plot with four horizontal bars each for one column (A, B, C, D)
# the bars represent the time variation and thus should change colour according to the values in the ABCD columns mapped to cmap colour map

df_plot_with_line

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

# this is what I would like plot to look like
# I use plt.scatter to show
fig = plt.figure(figsize=(15,2))
ax = fig.add_subplot(111)
cmap = cm.gnuplot
ax.scatter(x=df.index, y=[0]*df.A.shape[0], c=df.A, cmap=cmap)
ax.scatter(x=df.index, y=[1]*df.A.shape[0], c=df.B, cmap=cmap)
ax.scatter(x=df.index, y=[2]*df.A.shape[0], c=df.C, cmap=cmap)
cax = ax.scatter(x=df.index, y=[3]*df.A.shape[0], c=df.D, cmap=cmap)

# vertical color bar
clim = cax.get_clim()
cbar = fig.colorbar(cax, ticks=[min(clim),np.mean(clim),max(clim)], orientation='vertical')
cbar.ax.set_xticklabels(['Low', 'Medium', 'High'])

мое_текущее_решение

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


person AjanO    schedule 29.03.2017    source источник
comment
Речь идет о точечной диаграмме или гистограмме? В тексте вы пишете о гистограмме, а код показывает разброс. Является ли вопрос (A) Как я могу создать горизонтальную гистограмму, где полосы меняют цвет по горизонтали? Или (B) Как я могу создать цветовую полосу для отображения всех точечных диаграмм? Пожалуйста, решите и отредактируйте свой вопрос.   -  person ImportanceOfBeingErnest    schedule 29.03.2017
comment
Кроме того, пример изображения того, чего вы хотите достичь, может помочь.   -  person languitar    schedule 29.03.2017
comment
@ImportanceOfBeingErnest: Вопрос о гистограмме. Мое текущее временное решение использует точечный график. Насколько я понимаю, было бы хорошо включить то, что мы уже сделали. Часть с точечной диаграммой должна была помочь другим увидеть, чего я хочу достичь. Тем временем я тоже разбираюсь, как вставлять картинки.   -  person AjanO    schedule 29.03.2017
comment
Итак, что не так с текущим решением, использующим точечную диаграмму? Пожалуйста, назовите все, что вы не хотите или хотите изменить по сравнению с вашим текущим решением.   -  person ImportanceOfBeingErnest    schedule 29.03.2017
comment
@ImportanceOfBeingErnest Просто сделайте то же самое непосредственно из объекта фрейма данных. В вопросе четко указано, что я хочу сделать. Что так сбивает с толку? (Извините за мой английский)   -  person AjanO    schedule 29.03.2017
comment
Может быть, я просто не знаю, что означает непосредственно из объекта фрейма данных. Вы используете объект фрейма данных непосредственно в своем текущем решении.   -  person ImportanceOfBeingErnest    schedule 29.03.2017
comment
@ImportanceOfBeingErnest Да, все данные находятся в объекте фрейма данных. В примере я дал только четыре столбца. Их можно легко построить, используя line значение по умолчанию для функции графика фрейма данных. Однако я бы предпочел создать график другого типа: горизонтальная полоса, где полоса представляет изменение определенного столбца во фрейме данных с течением времени. Следовательно, цвет должен меняться в соответствии со значениями в соответствующем столбце.   -  person AjanO    schedule 29.03.2017
comment
Ну, кажется, вы ищете df.plot(kind="mycustomwishlistplot", x="x", y="y"), которого, конечно же, не существует.   -  person ImportanceOfBeingErnest    schedule 29.03.2017


Ответы (1)


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

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

df = pd.DataFrame(np.random.randn(1000, 4), index=pd.date_range('1/1/2000', periods=1000), 
                  columns=list('ABCD')).cumsum()

# create color normalizer
cnormer = colors.Normalize(df.min().min(), df.max().max())

# add new columns for the scatter plot
df['i'] = np.arange(1000)
for x in range(4):
    df['z{}'.format(x)] = x

# create an axis to plot on
fig, ax = plt.subplots(1,1,figsize=(10,3))

# make scatter plots
for x in range(4):
    df.plot(x='i', y='z{}'.format(x), kind='scatter', marker='o', edgecolor='none', 
            c=plt.cm.viridis(cnormer(df.iloc[:,x])), ax=ax)

Вам все равно нужно будет переформатировать метки и галочки.

введите здесь описание изображения

person James    schedule 29.03.2017
comment
Спасибо за представление о том, как создать нормализатор цвета. Теперь мне нужно выяснить, как использовать его для изменения цвета каждого прямоугольника, связанного с горизонтальной полосой. - person AjanO; 29.03.2017