python - 从 Python 的 Bokeh 到 Latex 的交互式 HTML 绘图

标签 python html matplotlib latex bokeh

我想嵌入一个基于 HTML 的交互式绘图(例如 http://docs.bokeh.org/en/0.10.0/docs/gallery/burtin.html )
在我使用 Latex 生成的 pdf 文档中。我可以使用 pythontex 在我的文档中嵌入基于 matplotlib 的绘图。然而,我无法嵌入基于 html 的绘图,如上所示。

如果您有任何见解,我将非常感激。只要它们允许我嵌入交互式绘图,我就愿意使用 Latex 以外的平台(甚至是 Microsoft Word),Python 笔记本除外。我在下面粘贴我的代码。预先非常感谢您抽出时间。

\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}  
\usepackage{amsmath}  
\usepackage{amsfonts}  
\usepackage{amssymb}  
\usepackage{pythontex}
\usepackage{graphicx }

\begin{document}


\begin{pycode} 
from collections import OrderedDict
from math import log, sqrt

import numpy as np
import pandas as pd
from six.moves import cStringIO as StringIO

from bokeh.plotting import figure, show, output_file

antibiotics = """
bacteria,                        penicillin, streptomycin, neomycin, gram
Mycobacterium tuberculosis,      800,        5,            2,        negative
Salmonella schottmuelleri,       10,         0.8,          0.09,     negative
Proteus vulgaris,                3,          0.1,          0.1,      negative
Klebsiella pneumoniae,           850,        1.2,          1,        negative
Brucella abortus,                1,          2,            0.02,     negative
Pseudomonas aeruginosa,          850,        2,            0.4,      negative
Escherichia coli,                100,        0.4,          0.1,      negative
Salmonella (Eberthella) typhosa, 1,          0.4,          0.008,    negative
Aerobacter aerogenes,            870,        1,            1.6,      negative
Brucella antracis,               0.001,      0.01,         0.007,    positive
Streptococcus fecalis,           1,          1,            0.1,      positive
Staphylococcus aureus,           0.03,       0.03,         0.001,    positive
Staphylococcus albus,            0.007,      0.1,          0.001,    positive
Streptococcus hemolyticus,       0.001,      14,           10,       positive
Streptococcus viridans,          0.005,      10,           40,       positive
Diplococcus pneumoniae,          0.005,      11,           10,       positive
"""

drug_color = OrderedDict([
("Penicillin",   "#0d3362"),
("Streptomycin", "#c64737"),
("Neomycin",     "black"  ),
])

gram_color = {
    "positive" : "#aeaeb8",
    "negative" : "#e69584",
}

df = pd.read_csv(StringIO(antibiotics),
skiprows=1,
skipinitialspace=True,
engine='python')

width = 800
height = 800
inner_radius = 90
outer_radius = 300 - 10

minr = sqrt(log(.001 * 1E4))
maxr = sqrt(log(1000 * 1E4))
a = (outer_radius - inner_radius) / (minr - maxr)
b = inner_radius - a * maxr

def rad(mic):
return a * np.sqrt(np.log(mic * 1E4)) + b

big_angle = 2.0 * np.pi / (len(df) + 1)
small_angle = big_angle / 7

x = np.zeros(len(df))
y = np.zeros(len(df))

output_file("burtin.html", title="burtin.py example")

p = figure(plot_width=width, plot_height=height, title="",
x_axis_type=None, y_axis_type=None,
x_range=[-420, 420], y_range=[-420, 420],
min_border=0, outline_line_color="black",
background_fill="#f0e1d2", border_fill="#f0e1d2")

p.line(x+1, y+1, alpha=0)

# annular wedges
angles = np.pi/2 - big_angle/2 - df.index.to_series()*big_angle
colors = [gram_color[gram] for gram in df.gram]
p.annular_wedge(
x, y, inner_radius, outer_radius, -big_angle+angles, angles, color=colors,
)

# small wedges
p.annular_wedge(x, y, inner_radius, rad(df.penicillin),
-big_angle+angles+5*small_angle, -big_angle+angles+6*small_angle,
color=drug_color['Penicillin'])
p.annular_wedge(x, y, inner_radius, rad(df.streptomycin),
-big_angle+angles+3*small_angle, -big_angle+angles+4*small_angle,
color=drug_color['Streptomycin'])
p.annular_wedge(x, y, inner_radius, rad(df.neomycin),
-big_angle+angles+1*small_angle, -big_angle+angles+2*small_angle,
color=drug_color['Neomycin'])

# circular axes and lables
labels = np.power(10.0, np.arange(-3, 4))
radii = a * np.sqrt(np.log(labels * 1E4)) + b
p.circle(x, y, radius=radii, fill_color=None, line_color="white")
p.text(x[:-1], radii[:-1], [str(r) for r in labels[:-1]],
text_font_size="8pt", text_align="center", text_baseline="middle")

# radial axes
p.annular_wedge(x, y, inner_radius-10, outer_radius+10,
-big_angle+angles, -big_angle+angles, color="black")

# bacteria labels
xr = radii[0]*np.cos(np.array(-big_angle/2 + angles))
yr = radii[0]*np.sin(np.array(-big_angle/2 + angles))
label_angle=np.array(-big_angle/2+angles)
label_angle[label_angle < -np.pi/2] += np.pi # easier to read labels on the left side
p.text(xr, yr, df.bacteria, angle=label_angle,
text_font_size="9pt", text_align="center", text_baseline="middle")

# OK, these hand drawn legends are pretty clunky, will be improved in future release
p.circle([-40, -40], [-370, -390], color=list(gram_color.values()), radius=5)
p.text([-30, -30], [-370, -390], text=["Gram-" + gr for gr in gram_color.keys()],
text_font_size="7pt", text_align="left", text_baseline="middle")

p.rect([-40, -40, -40], [18, 0, -18], width=30, height=13,
color=list(drug_color.values()))
p.text([-15, -15, -15], [18, 0, -18], text=list(drug_color.keys()),
text_font_size="9pt", text_align="left", text_baseline="middle")

p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None

show(p) 

\end{pycode}

\begin{center} 
\includegraphics[width=1\textwidth]{burtin.html}
\end{center}

\end{document}

最佳答案

从 Bokeh 0.12.1 开始,这是不可能的。虽然 Bokeh 是一个“Python”库,但它的设计和构思是为了让在浏览器中进行交互式可视化变得简单。因此,它具有大型 JavaScript 组件(实际上所有工作都是在其中完成的),并且需要运行 JavaScript 引擎(即 Web 浏览器)才能运行。

有一个“保存工具”可以让您通过手动单击按钮来从网页保存 PNG,但仅此而已。另外方法在 bokeh.export 可用于从 Python 生成静态 PNG 或 SVG。

关于python - 从 Python 的 Bokeh 到 Latex 的交互式 HTML 绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39233673/

相关文章:

python - 如何让 Pygame 渲染适用于我的神经网络?

html - CSS 列中断 <figcaption>

javascript - 如何停止在 Jquery 中克隆属性或标记

python - 如何更改 PyCharm Jupyter Notebook Pyplot 图形大小

python - 将一条线拟合到python中的矩阵

python - 请求/BeautifulSoup VS robots.txt

python - 尝试升级 pip,但出现错误 'WinError 5'

python - 我如何指定彩虹配色方案应如何转换为灰度

python - Seaborn FacetGrid - 在最后一个子图之后放置单个颜色条

php - 是否可以在单个查询中选择表 1 中的所有行和表 2 中的每一行元数据?