Python 使用matplotlib绘制semilogx,然后将其转换为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

我使用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_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部分:

  • 当我只使用上面的代码时,绘图是半对数的(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)
    

    从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)