con*_*use 1 python matplotlib number-formatting
所以我正在做一个带有内联标签的等高线图。标签应尽可能简洁。到目前为止,我正在使用:
import matplotlib.pyplot as plt
CS = plt.contour(dat, [2e6, 5e8, 8e11], norm = LogNorm(vmin=cutoff))
plt.clabel(CS, fontsize=9, inline=1, fmt="%.0g")
Run Code Online (Sandbox Code Playgroud)
这导致标签像
2e-06 5e+08 8e+11
我认为指数中不应该有前导零,如果指数为正,则应省略 sing,即上面的示例应为:
2e-6 5e8 2e11
我可以使用什么格式说明符或格式化程序函数来实现这一点?
为了根据您的意愿格式化轮廓标签(clabels),您可以使用格式化程序实例作为参数fmt
。
例如,要拥有漂亮的标签,您可以使用 a LogFormatterSciNotation
,它给出
import matplotlib.pyplot as plt
import matplotlib.ticker
import matplotlib.colors
import numpy as np
x = np.linspace(-6,7, 100)
X,Y = np.meshgrid(x,x)
dat = np.exp(-(X-2)**2-(Y-2)**2)* 15e12
cutoff = 1e6
CS = plt.contour(dat, [2e6, 5e8, 8e11], norm = matplotlib.colors.LogNorm(vmin=cutoff))
fmt = matplotlib.ticker.LogFormatterSciNotation()
fmt.create_dummy_axis()
plt.clabel(CS, fontsize=9, inline=1, fmt=fmt)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这里的 clabels 有点大,所以实际上可能不符合所需的内容。除了 Formatter 实例,还可以使用普通函数,该函数接受一个值作为输入并返回一个格式化的字符串。
因此,下面是一个通过删除加号和不必要的零来格式化数字的函数:
import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np
x = np.linspace(-6,7, 100)
X,Y = np.meshgrid(x,x)
dat = np.exp(-(X-2)**2-(Y-2)**2)* 15e12
cutoff = 1e6
CS = plt.contour(dat, [2e6, 5e8, 8e11], norm = matplotlib.colors.LogNorm(vmin=cutoff))
def func(x):
s = "%.0g" % x
if "e" in s:
tup = s.split('e')
significand = tup[0].rstrip('0').rstrip('.')
sign = tup[1][0].replace('+', '')
exponent = tup[1][1:].lstrip('0')
s = ('%se%s%s' % (significand, sign, exponent)).rstrip('e')
return s
plt.clabel(CS, fontsize=9, inline=1, fmt=func)
plt.show()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
767 次 |
最近记录: |