在matplotlib轴中向指数添加+符号

时间:2016-02-15 17:44:46

标签: python python-2.7 matplotlib

我有一个对数日志图,其范围从10^-310^+3。我希望值≥10^0在指数中有一个+符号,类似于值<10^0在指数中有-符号的方式。在matplotlib中有一种简单的方法吗?

我调查了FuncFormatter,但实现这一目标似乎过于复杂,我也无法让它发挥作用。

2 个答案:

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

enter image description here

格式字符串的一些解释:

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

此致