以科学风格设置自定义刻度的精度

时间:2019-02-25 15:15:26

标签: python matplotlib

我生成了以下代码来生成以下图形:

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1/10000, 1/2000, 13)
y = x**2
plt.plot(x, y, 'ro')
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), useMathText=True)

Correct precision, wrong tick positions

我想将xticks设置在数据位置。如果然后执行plt.xticks(x, rotation=45),则会在所需的位置获得刻度,但小数位数过多(请参见下图)。如何在指定位置获得刻度,但精度可控?

Wrong precision, correct tick positions

3 个答案:

答案 0 :(得分:1)

为了获得刻度标签的预定义格式,同时保持科学乘数,您可以使用答案here中的OOMFormatter的简化版本。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker

class FFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, fformat="%1.1f", offset=True, mathText=True):
        self.fformat = fformat
        matplotlib.ticker.ScalarFormatter.__init__(self,useOffset=offset,useMathText=mathText)
    def _set_format(self, vmin, vmax):
        self.format = self.fformat
        if self._useMathText:
            self.format = '$%s$' % matplotlib.ticker._mathdefault(self.format)

x = np.linspace(1/10000, 1/2000, 13)
y = x**2
plt.plot(x, y, 'ro')
plt.xticks(x, rotation=45)

fmt = plt.gca().xaxis.set_major_formatter(FFormatter(fformat="%1.1f"))
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), useMathText=True)

plt.show()

enter image description here

答案 1 :(得分:0)

我设法通过手动指定科学限制然后创建自定义标签来解决此问题:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1/10000, 1/2000, 13)
y = x**2
e = 4

plt.plot(x, y, 'ro')
# plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), useMathText=True)
plt.xticks(x, ['{:.1f}'.format(10**e*s) for s in x])
plt.text(1.01, 0, 'x$10^{{:d}}$'.format(e), transform=plt.gca().transAxes)

enter image description here

这可以解决问题,尽管它需要手动指定指数。

答案 2 :(得分:0)

执行此操作的一种简单方法是将ticks分配中的x值取整:

plt.xticks(np.round(x,decimals=6))

例如为我工作。

请注意,这实际上会将刻度线移动到指示的位置。只有一个小数点,这将清晰可见。