[英]How to plot Horizontal Bar Chart in Bokeh (Python)
我有这些数据:
data = {'Cities': {'Des_Moines': 80.0, 'Lubbock': -300.0, 'Minneapolis': 85.7,
'Orange_County': 80.0, 'Salt_Lake_City': 81.8, 'San_Diego': 80.0,
'San_Francisco': -400.0, 'Troy': -400.0, 'Wilmington': -300.0}}
我用Seaborn
绘制了它,它看起来很棒。
df_data = pd.DataFrame(data).sort_values('Cities', ascending=False)
sns.barplot(x='Cities', y=df_data.index, data=df_data, label='Cities', palette='Greens')
但是,我想使用Bokeh
嵌入这是一个Flask Web应用程序。
我在Bokeh
找不到horizontal barplot
。 即使翻转x
和y
轴似乎也不起作用。 这就是我所做的:*将df_data
从9x1
为1x9
。 然而,我仍然没有得到任何好东西。
bar = Bar(df_data.transpose(), df_data.columns.tolist(), stacked=False, responsive=True)
script, div = components(bar)
请注意,我仍然没有Horizontal
,我的category
轴搞砸了。
有人可以帮助进一步修改吗?
使用rect字形非常容易。 请注意,当您使用分类值设置y_range时,散景图中的这些索引的索引从1开始。这就是计数器“j”从1开始的原因。
import numpy as np
import pandas as pd
from bokeh.plotting import figure, show
from bokeh.models import Range1d
data = {'Cities': {'Des_Moines': 80.0, 'Lubbock': -300.0, 'Minneapolis': 85.7,
'Orange_County': 80.0, 'Salt_Lake_City': 81.8, 'San_Diego': 80.0,
'San_Francisco': -400.0, 'Troy': -400.0, 'Wilmington': -300.0}}
#df_data = pd.DataFrame(data).sort_values('Cities', ascending=False)
df_data = pd.DataFrame(data).sort(columns='Cities',ascending=False)
this_series = df_data.loc[:,'Cities']
p = figure(width=800, height=600, y_range=this_series.index.tolist())
p.background_fill = "#EAEAF2"
p.grid.grid_line_alpha=1.0
p.grid.grid_line_color = "white"
p.xaxis.axis_label = 'xlabel'
p.xaxis.axis_label_text_font_size = '14pt'
p.xaxis.major_label_text_font_size = '14pt'
#p.x_range = Range1d(0,50)
#p.xaxis[0].ticker=FixedTicker(ticks=[i for i in xrange(0,5,1)])
p.yaxis.major_label_text_font_size = '14pt'
p.yaxis.axis_label = 'ylabel'
p.yaxis.axis_label_text_font_size = '14pt'
j = 1
for k,v in this_series.iteritems():
print k,v,j
p.rect(x=v/2, y=j, width=abs(v), height=0.4,color=(76,114,176),
width_units="data", height_units="data")
j += 1
show(p)
您可以使用rect或quad字形进入低级别并重建水平条形图。 上面的代码是暂定的,在y轴上缺少城市标签(现在不再有时间......)。 但我希望这可以有所帮助。
data = {'Cities': {'Des_Moines': 80.0, 'Lubbock': -300.0, 'Minneapolis': 85.7,
'Orange_County': 80.0, 'Salt_Lake_City': 81.8, 'San_Diego': 80.0,
'San_Francisco': -400.0, 'Troy': -400.0, 'Wilmington': -300.0}}
from bokeh.plotting import figure, show
from bokeh.models import Range1d
from bokeh.palettes import Greens9
import numpy as np
cities = data['Cities']
p = figure(width=400, height=400)
bottom = -1
ii = -1
for k,v in cities.iteritems():
bottom = bottom+1
top = bottom+1
left = 0
right = cities[k]
ii += 1
p.quad(top=top, bottom=bottom, left=left,
right=right, color=Greens9[ii]) #"#B3DE69")
min_city = min(cities, key=cities.get)
max_city = max(cities, key=cities.get)
p.x_range = Range1d(start=cities[min_city], end=cities[max_city])
show(p)
# Can be done with rect glyph:
#p = figure(width=400, height=400)
#p.rect(x=[1, 2, 3], y=[1, 2, 3], width=0.2, height=40, color="#CAB2D6",
# angle=np.pi/2, height_units="screen")
我认为没有。 一个黑客可能是使用旋转的自定义CSS() http://www.w3schools.com/css/css3_2dtransforms.asp
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.