我应该使用哪种 Matplotlib 格式说明符来使等高线标签尽可能简洁?

Which Matplotlib format specifier do I use for contour labels to be as terse as possible?

所以我正在绘制一个带有等高线内联标签的等高线图。标签应尽可能简洁。到目前为止,我正在使用:

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

这导致像

这样的标签

2e-06 5e+08 8e+11

我认为指数中不应有前导零,如果指数为正,则应省略 sing,即上面的示例应为:

2e-6 5e8 2e11

我可以使用什么格式说明符或格式化程序函数来实现此目的?

为了按照您的意愿格式化轮廓标签 (clabels),您可以使用格式化程序实例作为 fmt 的参数。

例如,要获得漂亮的标签,您可以使用 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()

这里的 clabels 有点大,所以可能与实际需要的不符。除了 Formatter 实例,还可以只使用一个普通函数,该函数将一个值作为输入并 returns 一个格式化字符串。

下面是一个通过删除加号和不必要的零来格式化数字的函数:

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