博凯: 保存的 svg 与朱皮特笔记本上显示的不同

共1个回答, 标签: svg jupyter-notebook bokeh

我首先在笔记本中呈现该图形, 然后将其保存为 svg 形式。笔记本中的图形显示是正确的, 但保存的 svg 缺少一些标记。

#!/usr/bin/python3
import pandas as pd
import numpy as np
import math
from bokeh.plotting import figure, show, ColumnDataSource, save, output_file, reset_output
from bokeh.models import HoverTool, Legend
from bokeh.layouts import gridplot
import colorsys # needed for generating N equally extinguishable colors
from itertools import cycle

d = {'Sex': ['male', 'male','male','male', 'male','male','female','female','female','female','female','female'], 'age': [20, 20,20, 25,25,25,20, 20,20,25,25,25], 'working_hours': [20,30,40,20,30,40,20,30,40,20,30,40],'income': [1000, 2000,3000,1500, 2500,3500,1100, 2100,3100,1300, 2300,3300] }
values = pd.DataFrame(data=d)

x_var = 'working_hours'
x_var_dimension = 'H'
y_var = 'income'
y_var_dimension = 'Dollars'
hover = HoverTool(tooltips=[("data (x,y)", "(@x, @y)")])
TOOLS=[hover]
p= figure(width=1200, height=600,tools=TOOLS, x_axis_type='linear', x_axis_label='%s [%s]'%(x_var, x_var_dimension),y_axis_label='%s [%s]'%(y_var, y_var_dimension))
nr_expressions_row_col=9
figs_array_row_col = []
figs_row_row_col=[]
legend_its_row_col = []
legend_its_row_col_renderer = []
loop_count = 0;
markers = ['circle', 'square', 'triangle', 'asterisk', 'circle_x', 'square_x', 'inverted_triangle', 'x', 'circle_cross', 'square_cross', 'diamond', 'cross']
pool = cycle(markers)
for key, group in values.groupby(['Sex']):
    for key_sub1, group_sub1 in group.groupby(['age']):
        loop_count+=1
        x_data = group_sub1[x_var].values;
        y_data =  group_sub1[y_var].values
        (color_r,color_g,color_b) = colorsys.hsv_to_rgb(loop_count*1.0/nr_expressions_row_col, 1, 1)
        plot_row_col_line = p.line(x_data, y_data,line_color=(int(255*color_r),int(255*color_g),int(255*color_b)))
        plot_row_col_glyph = p.scatter(x_data, y_data, color=(int(255*color_r),int(255*color_g),int(255*color_b)), size=10, marker=next(pool))
        legend_its_row_col.append(("%s %s"%(key,key_sub1), [plot_row_col_line, plot_row_col_glyph]))


legend_row_col = Legend(items = legend_its_row_col, location=(0,0))
legend_row_col.click_policy = 'hide'
legend_row_col.background_fill_alpha = 0
p.add_layout(legend_row_col, 'left')

figs_row_row_col.append(p)
figs_array_row_col.append(figs_row_row_col)

grid_row_col = gridplot(figs_array_row_col)
reset_output()
output_notebook()
show(grid_row_col)
p.output_backend = "svg"
export_svgs(grid_row_col, filename="%s/"%'.' + "_" +"stackoverflow.svg")

以下是我在笔记本中看到的内容, 这是我所期望的:enter image description here

这是我在打开时看到的 "

"女性 25" 和 "男性 20" 的图例颜色部分为黑色。(标记部分) 和 "女性 20" 同时缺少标记及其图例。enter image description here

第1个答案

您在笔记本和导出的图像中看到不同颜色的原因是它们使用两个不同的后端。在最后一行中导出后端之前, 您将后端设置为 SVG。因此, 尽管导出的图像使用 SVG 后端, 但笔记本上的图像使用默认后端, 即画布。

后端可以设置有两个选项: 一个是您使用的选项, 另一个是在 output_backend="svg" 调用时添加参数 figure 的选项。也就是说, 替换

p= figure(width=1200, height=600,tools=TOOLS, x_axis_type='linear', x_axis_label='%s [%s]'%(x_var, x_var_dimension),y_axis_label='%s [%s]'%(y_var, y_var_dimension))

p= figure(width=1200, height=600,tools=TOOLS, x_axis_type='linear', x_axis_label='%s [%s]'%(x_var, x_var_dimension),y_axis_label='%s [%s]'%(y_var, y_var_dimension), output_backend="svg").

现在, 您将在笔记本映像上的导出图像中看到相同的问题。这似乎是 SVG 后端的一个错误, 很有可能他们正在为此而努力。遗憾的是, 没有修复 bug 的预期日期。

相关问题

如何设置 SVG 多边形的动画来填充? 博凯: 保存的 svg 与朱皮特笔记本上显示的不同 在宣传单上显示 SVG 如何将字典中的值与字符串中的多个元素相加? 如何再次在元组键值列表中转换它?