我正在尝试制作一个带有全息视图/散景的仪表板,有些数字相当大。这会触发科学记数法刻度(例如 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 可能是我的首选解决方案。
好吧,鉴于詹姆斯的回答,我想出了一个满足我的需求的解决方法......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