我应该使用哪种 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()
所以我正在绘制一个带有等高线内联标签的等高线图。标签应尽可能简洁。到目前为止,我正在使用:
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()