gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:01:40 25 4
gpt4 key购买 nike

因此,我正在绘制带有等高线内嵌标签的等高线图。标签应尽可能简洁。到目前为止,我正在使用:

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,它给出

enter image description here

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 实例,还可以只使用一个普通函数,该函数将一个值作为输入并返回一个格式化的字符串。

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

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

enter image description here

关于python - 我应该使用哪种 Matplotlib 格式说明符来使等高线标签尽可能简洁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43228427/

25 4 0