Python 使用matplotlib绘制semilogx,然后将其转换为Bokeh
我使用matplotlib绘制了一个包含多条曲线的图形,然后尝试将其转换为bokeh:Python 使用matplotlib绘制semilogx,然后将其转换为Bokeh,python,matplotlib,plot,bokeh,Python,Matplotlib,Plot,Bokeh,我使用matplotlib绘制了一个包含多条曲线的图形,然后尝试将其转换为bokeh: import numpy as np import matplotlib.pyplot as plt from bokeh import mpl from bokeh.plotting import show, output_file num_plots = 6 colormap = plt.cm.gist_ncar time = np.random.random_sample((300, 6)) s_s
import numpy as np
import matplotlib.pyplot as plt
from bokeh import mpl
from bokeh.plotting import show, output_file
num_plots = 6
colormap = plt.cm.gist_ncar
time = np.random.random_sample((300, 6))
s_strain = np.random.random_sample((300, 6))
def time_s_strain_bokeh(num_plots, colormap, time, s_strain):
plt.gca().set_color_cycle([colormap(i) for i in np.linspace(0, 0.9, num_plots)])
plt.figure(2)
for i in range(0, num_plots):
plt.plot(time[:,i], s_strain[:,i])
plt.grid(True)
# save it to bokeh
output_file('anywhere.html')
show(mpl.to_bokeh())
time_s_strain_bokeh(num_plots, colormap, time, s_strain)
它很好用。然而,我想要一个半对数图。当我将“for”循环中的plt.plot
更改为plt.semilogx
时,出现以下错误:
UnboundLocalError: local variable 'laxis' referenced before assignment
如何将x轴更改为对数刻度?我也有同样的问题!解决方案的1/2是这样的(假设我的数据位于名为pd的数据帧中): 我编辑了这个answare,因为我刚刚找到了解决方案的第2/2部分:
pd.plot(x='my_x_variable', y='my_y_variable)
p = mpl.to_bokeh()
p.x_mapper_type='log'
p.x_range.start= pd['my_x_variable'].iloc[1] # numpy start at 0, take care!
p.x_range.end= pd['my_x_variable'].iloc[-1]
show(p)
从Bokeh
0.12
开始,部分和不完整的MPL兼容性由第三方mplexporter
库提供,该库现在似乎未维护。在MPL团队实现之前,完整(或至少更完整)的MPL compat支持不会发生。然而,实施MEP 25是一项MPL项目任务,时间线/进度完全不在Bokeh项目的控制范围内
基于mplexporter
的现有MPL-compat是“按原样”提供的,以防它在当前工作的简单情况的子集中有用。我的建议是直接使用原生Bokeh API处理任何中等复杂度的事情
您可以在此处找到使用Bokeh API创建的半对数图的示例:
您试过了吗?是的,我在
plt.grid(True)
之后添加了这一行,但仍然得到相同的错误。自Bokeh 12.5(2017年4月)以来,因此mpl.to_Bokeh()
不再可用。也可以通过bryevdv看到。我经常看到/使用大量的matplotlib
代码。我“听到”你有一个MatMattLIB问题:但“写在本地BoKh”是投降不是解决方案。请考虑这是一个邀请作出贡献,使博克的MPL COMPATE更好。目前,核心团队要做的工作比人力所能完成的还要多,而更多的人选择帮助是唯一的补救办法。事实上,MPL支持可能会很快被弃用和删除,除非有新的维护人员挺身而出。这是投降吗?我想是吧。我不会为一天只有标准的24小时而道歉,也不会为“只”每周工作60小时免费给别人送东西而道歉。如果Bokeh不适合您的需要,欢迎您使用适合您的功能。无需道歉-请务必大声指出该功能可能已被弃用。我的意思是要说清楚。我需要决定如何支持matplotlib<代码>mpld3已暂停。看来,bokeh
不会支持它。我现在要对你的答案投赞成票,因为它给出了一个明确的答案。事实上答案不是我想要的?这不会改变*正确性*。现在-关于如何获得一些支持web的matplotlib。。这仍然是一个开放的(但不同的!)问题。我感谢你的理解,我同情你的挫折。我真心希望我能给出一个更好的答案。
pd.plot(x='my_x_variable', y='my_y_variable)
p = mpl.to_bokeh()
p.x_mapper_type='log'
p.x_range.start= pd['my_x_variable'].iloc[1] # numpy start at 0, take care!
p.x_range.end= pd['my_x_variable'].iloc[-1]
show(p)