散景中有两个 y 轴“计数”和“百分比”的直方图?

Histogram with two y-axis 'count' and 'percentage' in bokeh?

提问人:Lili 提问时间:10/25/2023 最后编辑:mosc9575Lili 更新时间:10/25/2023 访问量:32

问:

我是散景新手。在散景中创建数据直方图的干净方法是什么,有两个 y 轴,一个是“计数”,一个是“百分比”?我使用四边形创建带有“计数”轴标签的直方图,然后使用extra_y_ranges和add_layout添加第二个轴。不幸的是,y 轴并不总是对齐的。我相信有更好的方法可以做到这一点。另外,如何旋转正确的y_axis标签?我希望它有和左边y_axis相同的方向。 我最终也喜欢叠加发行版的 pdf。

感谢您的帮助。

这是我用“四边形”和extra_y_ranges创建的图,我明白这一点,不喜欢“百分比”的方向。enter image description here

Python 直方图 散景 方向

评论


答:

0赞 mosc9575 10/25/2023 #1

我的建议是

  1. 根据数据将 From 设置为两个 y 轴Range1dbokeh.models
  2. 绘制两次,一次绘制不带任何颜色的第二个 y 轴quad
  3. 使用 axis_label_orientation 设置标签的方向

下面是一个最小的示例:

这是存储在 pandas DataFrame 中的一个非常小的数据集

import pandas as pd
df = pd.DataFrame({'data':[12,1,2,11,22,3,4]})
df['percent'] = df['data'] / df["data"].sum()
df['left'] = df.index - 0.4
df['right'] = df.index + 0.4

散景部分如下所示。

from bokeh.models import ColumnDataSource, LinearAxis, Range1d
from bokeh.plotting import figure, show, output_notebook
output_notebook()

source= ColumnDataSource(df)

# figure
p = figure(width=700, height=300)

# default axis
p.quad(top='data', bottom=0, left='left', right='right', source=source)
p.yaxis.axis_label = "count"
p.yaxis.axis_label_orientation = 'horizontal'
p.y_range = Range1d(0, df['data'].max() * 1.05)

# second axis
p.extra_y_ranges['percent'] = Range1d(0, df['percent'].max() * 1.05)
red_circles = p.quad(
    top='data',
    bottom=0,
    left='left',
    right='right',
    source=source,
    color=None,
    y_range_name="percent"
)

ax2 = LinearAxis(
    axis_label="percent",
    y_range_name="percent",
    axis_label_orientation = 'horizontal'
)
p.add_layout(ax2, 'right')

# output
show(p)

one data set with two y axis