在散景中创建跨两列的聚集条形图
Create clustered bar chart across two columns in bokeh
我有一个如下所示的数据框:
type price1 price2
0 A 5450.0 31980.0
1 B 5450.0 20000.0
2 C 15998.0 18100.0
我想要的是绘制 "type" 与 "price" 的簇状条形图。最终目标是一个图表,每种类型都有两个条形图,一个条形图代表 "price1",另一个条形图代表 "price2"。两列的单位相同($)。使用 Bokeh 我可以按类型分组,但我似乎无法按通用 "price" 单位分组。到目前为止我有这个代码:
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])
但这只会让我为每种类型得到一列。
我如何修改我的代码以获得每种类型的两个柱状图?
您要搜索的是 grouped Bar 情节。
但是你必须稍微重新组织你的数据,以便散景(或更好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)
您的 table 是 "wide" 格式。您想首先使用 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()
关于长格式和宽格式的好 post 可以在这里找到:
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)
我有一个如下所示的数据框:
type price1 price2
0 A 5450.0 31980.0
1 B 5450.0 20000.0
2 C 15998.0 18100.0
我想要的是绘制 "type" 与 "price" 的簇状条形图。最终目标是一个图表,每种类型都有两个条形图,一个条形图代表 "price1",另一个条形图代表 "price2"。两列的单位相同($)。使用 Bokeh 我可以按类型分组,但我似乎无法按通用 "price" 单位分组。到目前为止我有这个代码:
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])
但这只会让我为每种类型得到一列。
我如何修改我的代码以获得每种类型的两个柱状图?
您要搜索的是 grouped Bar 情节。
但是你必须稍微重新组织你的数据,以便散景(或更好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)
您的 table 是 "wide" 格式。您想首先使用 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()
如果您坚持使用散景,这里是 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)