更好的 Bokeh/Holoviews 科学记数法

问题描述 投票:0回答:1

我正在尝试制作一个带有全息视图/散景的仪表板,有些数字相当大。这会触发科学记数法刻度(例如 1.00e+4 ... 2.00e+5)。我不喜欢它的外观,所以我想实现两件事中的一件,但似乎两者都无法工作。

选项 1:以 2.0x105 的形式显示刻度,甚至 2.0E5。
选项 2:我可以将数据除以 104 并将轴标签更改为“X x104

对于选项 1,我不知道如何使用 Bokeh 刻度格式器来执行此操作以提供全息视图。看起来我需要使用 CustomJSTickFormatter,但我不知道 javascript,所以这对我没有帮助。

对于选项 2:每次我尝试使用 LaTeX 或 MathML 作为标签字符串时,它都会截断标签并无法渲染它。

这是我的最小可重现代码:
散景.__版本__ = 3.6.1
Holoviews.__version__ = 1.20.0

x = np.linspace(start=0, stop=100000, num=25)
y = np.linspace(start=0, stop=35, num=25)
df_test = pd.DataFrame({'x':x, 'y': y, 'x2':x/10000})
hv.Points(df_test, ['x2', 'y']).opts(xlabel=r'$$\text{ This is messed up } \times 10^6$$')

选项 2 的输出:
BokehOutput_Opt2

如果我能让它正确渲染,选项 2 可能是我的首选解决方案。

python plot bokeh holoviews
1个回答
0
投票

好吧,鉴于詹姆斯的回答,我想出了一个满足我的需求的解决方法......Unicode!


    import holoviews as hv
    
    # create a dictionary to convert numbers to superscripts
    super_dict = {1:'\u00b1',
                  2:'\u00b2',
                  3:'\u00b2',
                  4:'\u2074',
                  5:'\u2075',
                  6:'\u2076',
                  7:'\u2077',
                  8:'\u2078',
                  9:'\u2079',
                  0:'\u2070'}
    
    # use some math to find the closest power of 10 that is below your
    # desired max. In my case, I wanted 10 rather than 1. One could also
    # probably modify this use %3 to cut off at some reasonable thousand
    def simplify_data(data, col):
        import math
        import numpy as np
        logscale = math.floor(np.log10(data[col].max()))
        new_data = data[col]/(10**(logscale-1))
        new_label = f'{col}/10{super_dict[logscale-1]}'
        data.loc[:, [new_label]] = new_data
        return data, new_label
    
    # create synthetic data
    x = np.linspace(start=0, stop=200000, num=25)
    y = np.linspace(start=0, stop=35, num=25)
    df_test = pd.DataFrame({'x':x, 'y': y})

    # run my new function to generate my scaled variable
    df_test, new_col = simplify_data(df_test, 'x')
    hv.Points(df_test, [new_col, 'y'])
    # the .opts(xlabel=...) is now not needed either

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.