用matplotlib绘制semilogx,然后将其转换为Bokeh

时间:2015-10-22 12:58:32

标签: python matplotlib plot bokeh

我使用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轴更改为对数刻度?

2 个答案:

答案 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部分:

  1. 当我只使用上面的代码时,情节是semilog(ok!),但x轴被翻转(镜像)!!!

  2. 我找到的解决方案是明确重新定义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结尾

  3. 有了这个,我的情节与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