散景可以创建 facet_grid 情节吗?
Can bokeh create facet_grid plot?
在散景中,我们可以创建分类坐标图。
https://docs.bokeh.org/en/latest/docs/user_guide/categorical.html
我可以绘制类似 ggplot 的 facet_grid 吗?在不同位置有两个水平 X 轴。 (顶部和底部)谢谢。
我不确定散景有什么开箱即用的东西可以做到这一点。你可能必须创建你想要的情节,然后 运行 通过某种 for 循环,然后使用 layout。
还是不太理想:
- 您无法正确设置背景颜色或小标题(可以通过手动定位切换到
Div
s 而不是 Title
s 来缓解)
- 由于标题和轴(我不知道有什么方法可以解决),绘图不相同 width/height
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)
在散景中,我们可以创建分类坐标图。 https://docs.bokeh.org/en/latest/docs/user_guide/categorical.html
我可以绘制类似 ggplot 的 facet_grid 吗?在不同位置有两个水平 X 轴。 (顶部和底部)谢谢。
我不确定散景有什么开箱即用的东西可以做到这一点。你可能必须创建你想要的情节,然后 运行 通过某种 for 循环,然后使用 layout。
还是不太理想:
- 您无法正确设置背景颜色或小标题(可以通过手动定位切换到
Div
s 而不是Title
s 来缓解) - 由于标题和轴(我不知道有什么方法可以解决),绘图不相同 width/height
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)