我使用matplotlib绘制包含多条曲线的图形,然后尝试将其转换为散景:
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)
它工作正常。但是,我希望有一个semilogx情节。当我在" for"中更改plt.plot
时循环到plt.semilogx
,我有以下错误:
UnboundLocalError: local variable 'laxis' referenced before assignment
如何将x轴更改为对数刻度?
答案 0 :(得分:1)
我有同样的问题!解决方案的一半是这个(我的数据是在一个名为pd的Pandas数据框中):
pd.plot(x='my_x_variable', y='my_y_variable)
p = mpl.to_bokeh()
p.x_mapper_type='log' # I found this property with p.properties_with_values()
show(p)
我编辑了这个answare,因为我刚刚找到了解决方案的第2/2部分:
当我只使用上面的代码时,情节是semilog(ok!),但x轴被翻转(镜像)!!!
我找到的解决方案是明确重新定义xlim:
p.x_range.start = 0.007#supose pd [' my_x_variable']从0.007开始 p.x_range.end = 0.17 #supose pd [' my_x_variable']以0.17结尾
有了这个,我的情节与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)
答案 1 :(得分:1)
从Bokeh 0.12
开始,部分和不完整的MPL兼容性由第三方mplexporter
库提供,现在看来它是未维护的。在MPL团队实施MEP 25之前,不会发生完整(或至少更完整)的MPL compat支持。但是,实施MEP 25是一项MPL项目任务,时间表/时间表完全不受Bokeh项目的控制。
提供基于mplexporter
的现有MPL compat"原样"如果它在当前适用的简单情况子集中有用。我的建议是直接使用原生的Bokeh API来处理任何中等复杂程度的东西。
您可以在此处找到使用Bokeh API创建的semilog图的示例:
http://bokeh.pydata.org/en/latest/docs/user_guide/plotting.html#log-scale-axes