带有标称/分类x轴+双y轴的Python散景条形图

时间:2016-01-22 10:30:19

标签: python plot axis bokeh

如何创建一个散景图,该图是一个条形图,左右y-axis?我想从数据框中绘制两列,其中行ID是分类的,它应该是x-axis。 Wint只有一个y-axisBar效果不错,但我不知道如何将extra_y_ranges添加到条形图或更好地说我可以创建extra_y_ranges但我无法使用条形图中的add_layout。我无法以第一列与左y-axis相关的方式绘制我的数据框列,第二列与右y-axis相关。

我尝试使用figure.quad手动创建条形图。我必须使用x_range=my_df.index因为我需要分类x-axis。我在leftright参数中使用相同的值,我使用line_width=7不是一行而是一个条。但是我必须将我的条形图稍微向左移动,因为我想在相同的分类ID上绘制我的第二个属性。 所以我的问题是:如何将情节向左/右移动?

以下是我做的示例:

from bokeh.plotting import figure, output_file, show
from bokeh.models import LinearAxis, Range1d

output_file("bars.html")

p = figure(title="twin y-axis bar example", x_range=['0','4','2'])

p.quad(bottom=0, top=[70,60,50], left=['0','4','2'], right=['0','4','2']
    , line_width=7, line_color='red')

p.extra_y_ranges = {'foo':Range1d(start=0, end=20)}
p.add_layout(LinearAxis(y_range_name='foo', axis_label='right_y_axis'), place='right')

p.quad(bottom=0, top=[15,10,5], left=['0','4','2'], right=['0','4','2']
    , line_width=7, line_color='blue', y_range_name='foo')

show(p)

所以我想稍微偏离红色条,稍微偏向蓝色条,不要互相遮挡。

谢谢!!!

1 个答案:

答案 0 :(得分:0)

我能够解决"这个问题以一种可怕的方式出现:我创建了许多空类别(名称中的空格数量不同)。在我的例子中它看起来不太好但是如果有人有更多的类别(例如> 10)那么它看起来就像一个真正的普通条形图。当然,这些空类别可以使用数据框方法轻松生成,但在我的示例代码中,我只使用列表。 这是我的代码:

from bokeh.plotting import figure, output_file, show
from bokeh.models import LinearAxis, Range1d

output_file("bars.html")

p = figure(title="twin y-axis bar example", x_range=['','0','',' ','4',' '
    ,'  ','2','  ','   ','7','   ','    ','3','    ','     ','1','     '])

p.quad(bottom=0, top=[70,68,50,48,30,28], left=['',' ','  ','   ','    ','     ']
    , right=['',' ','  ','   ','    ','     '], line_width=7, line_color='red')

p.yaxis.axis_label = 'left y axis'
p.yaxis.axis_label_text_color = 'red'

p.extra_y_ranges = {'foo':Range1d(start=-1, end=21)}
p.add_layout(LinearAxis(y_range_name='foo', axis_label='right y axis'
    , axis_label_text_color='blue'), place='right')

p.quad(bottom=0, top=[18,15,12,9,6,3], left=['0','4','2','7','3','1']
    , right=['0','4','2','7','3','1'], line_width=7, line_color='blue', y_range_name='foo')

p.xaxis.axis_label = 'x axis'
p.xaxis.axis_label_standoff = -5

show(p)