散景可以创建facet_grid图吗?

问题描述 投票:0回答:2

在散景中,我们可以创建分类坐标图。 https://docs.bokeh.org/en/latest/docs/user_guide/categorical.html

enter image description here

我可以绘制类似ggplot的facet_grid之类的东西吗?在不同位置有两个水平 X 轴。 (顶部和底部)谢谢。 enter image description here

python bokeh
2个回答
2
投票

我不确定散景是否有任何开箱即用的东西可以做到这一点。 您可能必须创建所需的绘图,然后通过某种 for 循环运行它,然后使用 layout


1
投票

还是不太理想:

  • 无法正确设置背景颜色或小标题(可以通过手动定位切换到
    Div
    而不是
    Title
    来缓解)
  • 由于标题和轴的原因,绘图没有相同的宽度/高度(我不知道有什么方法可以修复它)
from random import random, randint

from bokeh.io import show
from bokeh.models import Div, Title
from bokeh.plotting import figure
from bokeh import layouts

major_x = ['Fri', 'Sat', 'Sun', 'Thur']
major_y = ['Female', 'Male']

minor_x = (0, 50)
minor_y = (0, 1)

height = 300
width = 300


def generate_datum(start, end):
    return random() * (end - start) + start


def generate_data():
    n = randint(10, 100)
    return dict(x=[generate_datum(*minor_x) for _ in range(n)],
                y=[generate_datum(*minor_y) for _ in range(n)])


full_data = {(x, y): generate_data() for x in major_x for y in major_y}


def pad_range(start, end):
    d = (end - start) * 0.1
    return start - d, end + d


def add_title(p, text, position):
    t = Title(text=text, align='center')
    p.add_layout(t, position)


column = []
for y in major_y:
    row = []
    for x in major_x:
        p = figure(x_range=pad_range(*minor_x), y_range=pad_range(*minor_y),
                   toolbar_location=None, tools='hover', width=width, height=height)
        p.xaxis.visible = (y == major_y[-1])
        p.yaxis.visible = (x == major_x[0])
        data = full_data[(x, y)]
        p.circle(x=data['x'], y=data['y'])
        if y == major_y[0]:
            add_title(p, x, 'above')
        if x == major_x[-1]:
            add_title(p, y, 'right')
        row.append(p)
    column.append(layouts.row(row))

major_y_label = f'''
<div style="display: flex; align-items: center; height: {height * len(major_y)}px;">
  <div style="writing-mode: tb-rl; transform: rotate(-180deg); font-size: 1.5em;">
    tip/total_bill
  </div>
</div>
'''

major_x_label = f'''
<div style="display: flex; justify-content: center; width: {width * len(major_x)}px;">
  <div style="font-size: 1.5em;">
    total_bill
  </div>
</div>
'''

full_plot = layouts.grid([[Div(text=major_y_label), layouts.column(column)],
                          [None, Div(text=major_x_label)]])

show(full_plot)

plot

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.