如何将散景图保存为 PDF?
How to save a Bokeh plot as PDF?
我经常使用 Bokeh,我正在寻找一种方法来从我创建的图形中创建 PDF。
是否有实现此目标的选项?
三个 python 包 bokeh
、svglib
和 reportlab
的组合非常适合我。
这将包括 3 个步骤:
- 创建散景 svg 输出
- 读入这个 svg
- 将此 svg 保存为 pdf
最小示例
要展示这是如何工作的,请看下面的例子。
from bokeh.plotting import figure
from bokeh.io import export_svgs
import svglib.svglib as svglib
from reportlab.graphics import renderPDF
test_name = 'bokeh_to_pdf_test'
# Example plot p
p = figure(plot_width=400, plot_height=400, tools="")
p.circle(list(range(1,6)),[2, 5, 8, 2, 7], size=10)
# See comment 1
p.xaxis.axis_label_standoff = 12
p.xaxis.major_label_standoff = 12
# step 1: bokeh save as svg
p.output_backend = "svg"
export_svgs(p, filename = test_name + '.svg')
# see comment 2
svglib.register_font('helvetica', '/home/fonts/Helvetica.ttf')
# step 2: read in svg
svg = svglib.svg2rlg(test_name+".svg")
# step 3: save as pdf
renderPDF.drawToFile(svg, test_name+".pdf")
评论 1
axis_label_standoff
和 major_label_standoff
有一个额外的信息,因为 x 轴的刻度在没有这个定义的情况下移动了一点,这看起来不太好。
评论2
如果您收到一长串警告,例如
Unable to find a suitable font for 'font-family:helvetica'
Unable to find a suitable font for 'font-family:helvetica'
....
Unable to find a suitable font for 'font-family:helvetica'
这并不意味着创建了 pdf。出现此警告是因为 bokeh 中的默认字体名为 helvetica
,svglib
不知道。 svglib
在定义的位置查找此字体。如果没有此字体,则会显示该消息。
要删除此消息,您可以像这样在 svglib
中注册字体
# name in svglib, path to font
svglib.register_font('helvetica' , f'/{PATH_TO_FONT}/Helvetica.ttf')
就在调用 svglib.svg2rlg()
.
之前
输出
此代码将创建同一个图形两次,一次带有后缀 .svg
,一次带有后缀 .pdf
.
图形是这样的:
我经常使用 Bokeh,我正在寻找一种方法来从我创建的图形中创建 PDF。
是否有实现此目标的选项?
三个 python 包 bokeh
、svglib
和 reportlab
的组合非常适合我。
这将包括 3 个步骤:
- 创建散景 svg 输出
- 读入这个 svg
- 将此 svg 保存为 pdf
最小示例
要展示这是如何工作的,请看下面的例子。
from bokeh.plotting import figure
from bokeh.io import export_svgs
import svglib.svglib as svglib
from reportlab.graphics import renderPDF
test_name = 'bokeh_to_pdf_test'
# Example plot p
p = figure(plot_width=400, plot_height=400, tools="")
p.circle(list(range(1,6)),[2, 5, 8, 2, 7], size=10)
# See comment 1
p.xaxis.axis_label_standoff = 12
p.xaxis.major_label_standoff = 12
# step 1: bokeh save as svg
p.output_backend = "svg"
export_svgs(p, filename = test_name + '.svg')
# see comment 2
svglib.register_font('helvetica', '/home/fonts/Helvetica.ttf')
# step 2: read in svg
svg = svglib.svg2rlg(test_name+".svg")
# step 3: save as pdf
renderPDF.drawToFile(svg, test_name+".pdf")
评论 1
axis_label_standoff
和 major_label_standoff
有一个额外的信息,因为 x 轴的刻度在没有这个定义的情况下移动了一点,这看起来不太好。
评论2
如果您收到一长串警告,例如
Unable to find a suitable font for 'font-family:helvetica'
Unable to find a suitable font for 'font-family:helvetica'
....
Unable to find a suitable font for 'font-family:helvetica'
这并不意味着创建了 pdf。出现此警告是因为 bokeh 中的默认字体名为 helvetica
,svglib
不知道。 svglib
在定义的位置查找此字体。如果没有此字体,则会显示该消息。
要删除此消息,您可以像这样在 svglib
中注册字体
# name in svglib, path to font
svglib.register_font('helvetica' , f'/{PATH_TO_FONT}/Helvetica.ttf')
就在调用 svglib.svg2rlg()
.
输出
此代码将创建同一个图形两次,一次带有后缀 .svg
,一次带有后缀 .pdf
.
图形是这样的: