我有一个对数日志图,其范围从10^-3
到10^+3
。我希望值≥10^0
在指数中有一个+
符号,类似于值<10^0
在指数中有-
符号的方式。在matplotlib中有一种简单的方法吗?
我调查了FuncFormatter
,但实现这一目标似乎过于复杂,我也无法让它发挥作用。
答案 0 :(得分:5)
您可以使用FuncFormatter
模块中的matplotlib.ticker
执行此操作。您需要了解tick的值是否大于或小于1的条件。因此,如果log10(tick value)
为>0
,则在标签字符串中添加+
符号,如果没有,那么它会自动得到它的减号。
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
# sample data
x = y = np.logspace(-3,3)
# create a figure
fig,ax = plt.subplots(1)
# plot sample data
ax.loglog(x,y)
# this is the function the FuncFormatter will use
def mylogfmt(x,pos):
logx = np.log10(x) # to get the exponent
if logx < 0:
# negative sign is added automatically
return u"$10^{{{:.0f}}}$".format(logx)
else:
# we need to explicitly add the positive sign
return u"$10^{{+{:.0f}}}$".format(logx)
# Define the formatter
formatter = ticker.FuncFormatter(mylogfmt)
# Set the major_formatter on x and/or y axes here
ax.xaxis.set_major_formatter(formatter)
ax.yaxis.set_major_formatter(formatter)
plt.show()
格式字符串的一些解释:
"$10^{{+{:.0f}}}$".format(logx)
将双括号{{
和}}
传递给LaTeX
,表示其中的所有内容都应作为指数引发。我们需要双括号,因为python使用单个大括号来包含格式字符串,在本例中为{:.0f}
。有关格式规范的更多说明,请参阅docs here,但TL;对于您的情况,DR是格式化浮点数,精度为0位小数(即基本上将其打印为整数);在这种情况下,exponent是一个float,因为np.log10
返回一个float。 (也可以将np.log10
的输出转换为int,然后将该字符串格式化为int - 只是您喜欢的偏好问题。)
答案 1 :(得分:0)
我希望这就是你的意思:
def fmt(y, pos):
a, b = '{:.2e}'.format(y).split('e')
b = int(b)
if b >= 0:
format_example = r'$10^{+{}}$'.format(b)
else:
format_example = r'$10^{{}}$'.format(b)
return
然后使用FuncFormatter
,例如对于颜色栏:plt.colorbar(name_of_plot,ticks=list_with_tick_locations, format = ticker.FuncFormatter(fmt))
。我认为你必须导入import matplotlib.ticker as ticker
。
此致