2017-01-24 1 views
4

У меня есть кадр данных, который выглядит следующим образом:Создать кластерную гистограмму через две колонок в боке

 type price1  price2 
0  A  5450.0  31980.0 
1  B  5450.0  20000.0 
2  C  15998.0 18100.0 

То, что я хочу, это кластерная гистограмма, что участки «тип» против «цены». Конечной целью является диаграмма, которая имеет два бара для каждого типа, один бар для «price1», а другой для «price2». Оба столбца находятся в одной единице ($). Используя Bokeh, я могу группироваться по типу, но я, похоже, не группирую единицу «цена». У меня есть этот код до сих пор:

import pandas as pd 
import numpy as np 
from bokeh.charts import Bar, output_file, show 
from bokeh.palettes import Category20 as palette 
from bokeh.models import HoverTool, PanTool 
p = Bar(
     df, 
     plot_width=1300, 
     plot_height=900, 
     label='type', 
     values='price2', 
     bar_width=0.4, 
     legend='top_right', 
     agg='median', 
     tools=[HoverTool(), PanTool()], 
     palette=palette[20]) 

Но это только дает мне по одной колонке для каждого типа. enter image description here

Как я могу изменить свой код, чтобы получить два столбца для каждого типа?

+0

Пожалуйста, помогите мне решить эту проблему – dopatraman

+0

Небольшая вещь, я не могу импортировать эту палитру, которую вы используете. 'ImportError: не может импортировать имя Category20', а' hover' должен быть 'HoverTool()'. – Khris

+0

@ Крис, извините, я оставил экземпляр инструмента зависания. обновлено. как для палитры, какую версию боке вы используете? – dopatraman

ответ

2

Ваш стол "широкий" формат. вы хотите сначала расплавить его в длинном формате, используя функцию pd.melt(). Для визуализации я предлагаю вам использовать пакет «Seaborn» и сделать вашу жизнь проще. вы можете визуализировать каждую вещь в одной строке.

import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 

your_df = pd.DataFrame(data={'type': ['A','B','C'], 
     'price1':[5450, 5450, 15998], 
     'price2' : [3216, 20000, 15000]}) 

long_df = pd.melt(your_df,id_vars = ['type'],value_vars =['price1','price2']) 
print long_df 

my_plot = sns.barplot(x="type", y="value",hue = "variable", data=long_df) 
sns.plt.show() 

enter image description here Хороший пост на длинных и широких форматов можно найти здесь: Reshape Long Format Multivalue Dataframes with Pandas

, если вы настаиваете на использовании боке вот как вы это делаете, как renzop отметил:

p = Bar(long_df, 
    plot_width=1000, 
    plot_height=800, 
    label='type', 
    values='value', 
    bar_width=0.4, 
    group='variable', 
    legend='top_right') 

show(p) 
+0

Почему это было downvoted? очень полезно – dopatraman

+0

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

+0

Я имел в виду его длинный формат и широкоформатный аргумент, он имеет df2 в комментариях. Сообщение показывает повторение некоторых значений в df2, что не является систематическим способом решения этой проблемы. Я обнаружил, что @renzop также говорил о расплаве() в комментариях ниже своего сообщения. –

4

Все, что вы ищете, это grouped Bar Участок.

Но вам нужно немного реорганизовать свои данные, чтобы bokeh (или лучше Pandas) смог правильно группировать данные.

df2 = pd.DataFrame(data={'type': ['A','B','C', 'A', 'B', 'C'], 
      'price':[5450, 5450, 15998, 3216, 20000, 15000], 
      'price_type':['price1', 'price1', 'price1', 'price2', 'price2', 'price2']}) 

p = Bar(
     df2, 
     plot_width=1300, 
     plot_height=900, 
     label='type', 
     values='price', 
     bar_width=0.4, 
     group='price_type', 
     legend='top_right') 
    show(p) 

result

+0

Я вижу, спасибо. но у меня есть проблема с организацией моих данных таким образом. 'price_type' является свойством столбца, а не строки. ваша организация является последней. – dopatraman

+0

То, что вы хотите, не представляется возможным с сюжетом на высоком уровне, вам, вероятно, нужно перейти на более низкие уровни боке или создать сюжет с другой библиотекой и импортировать его в боке, как описано здесь: http: // bokeh .pydata.org/ru/latest/docs/user_guide/ compat.html # matplotlib-seaborn-ggplot-and-pandas – Khris

+1

Когда у вас есть кадр данных pandas, вы всегда можете его реорганизовать, пока он не соответствует вашим требованиям, вот что они сделаны для. (проверьте изменение/поворот). Это сюжет, как вы этого хотели? – renzop

Смежные вопросы