2017-01-24 13 views
4

に2列にわたってクラスタ化された棒グラフを作成します。私が欲しいもの私はこのようになり、データフレーム持ってボケ

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

は「価格」に対するクラスタ化された棒グラフそのプロット「タイプ」です。最終目標は、各タイプの2つの棒、「price1」のバーと「price2」の棒の2つの棒グラフです。両方の列が同じ単位($)にあります。 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]) 

しかし、それは私の種類ごとに1つの列を取得します。 enter image description here

タイプごとに2つのバーが表示されるようにコードを変更するにはどうすればよいですか?

+0

この問題を解決するのを手伝ってください – dopatraman

+0

小さなものですが、使用しているパレットをインポートできません。 'ImportError:名前をCategory20にインポートできません。' 'hover'は' HoverTool() 'でなければなりません。 – Khris

+0

@Khris申し訳ありませんが、私はホバーツールのインスタンスを外しました。更新しました。パレットの場合は、どのバージョンのbokehを使用していますか? – dopatraman

答えて

2

あなたのテーブルには、 "ワイド" の形式です。最初にpd.melt()関数を使用して長い形式に解凍します。視覚化のために、私はあなたが "Seaborn"パッケージを使用し、あなたの人生を楽にすることをお勧めします。すべてのものを1つの行に表示することができます。

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

なぜこれが下落したのですか?非常に助けて – dopatraman

+0

はい、溶融機能またはbarchartsはレンゾーによって発明されました。私はその答えをチェックしなかった。さもなければ私は彼に信用を与えただろう。これはそれを行う通常の手順です。 –

+0

私は彼の長いフォーマットと広いフォーマットの議論のために、彼はコメントにdf2を持っていました。このポストは、この問題について体系的なやり方ではないdf2の値の繰り返しを示しています。私は@renzopが彼のポストの下のコメントにmelt()についても話していることを発見しました。 –

4

あなたが探しているものはgrouped Barです。

しかし、ボケ(またはより良いパンダ)がデータを正しくグループ化できるように、データを少し再編成する必要があります。

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/en/latest/docs/user_guide/compat.html#matplotlib-seaborn-ggplot-and-pandas – Khris

+1

パンダのデータフレームがあるときは、要件に合うまで、いつでも再編成することができます。ために。 (チェックリシェイプ/ピボット)。プロットはあなたがそれを望んでいたか? – renzop

関連する問題