Python matplotlib科学坐标轴格式化

Python matplotlib scientific axis formating

我已经编辑了我的问题,我相信这样更具有指导意义,

我正在使用 matplotlib 绘制图表,但我遇到了轴格式问题。我不知道如何强迫他一直使用相同的科学格式:在下面的示例中,e4(而不是 e4 和 e2)。我也想总是有两位小数 - 任何的想法 ?有关的文档不是很广泛。

创建随机 df 数据:

import numpy as np
import matplotlib.pyplot as plt
from pandas.stats.api import ols
import pandas as pd

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(100000)
y = x *100 + (np.random.randn()*100)

计算线性回归:

df = pd.DataFrame({'x':x,'y':y})
res = ols(y=df['y'], x=df['x'])
df['yhat'] = df['x']*res.beta[0] + res.beta[1]

绘图:

plt.scatter(df['x'], df['y'])  
plt.plot(df['x'], df['yhat'], color='red') 
plt.title('Scatter graph with linear regression')              
plt.xlabel('X')
plt.ylabel('Y')
plt.ticklabel_format(style='sci', scilimits=(0,0))
plt.ylim(0)
plt.xlim(0)

请找出输出here

据我所知,matplotlib 并没有提供开箱即用的选项。文档确实很少(Ticker API is the place to go). The Formatter classes are responsible for formatting the tick values. Out of the ones offered, only ScalarFormatter(默认格式化程序)提供科学格式,但是,它不允许固定有效数字的指数或数量。一种替代方法是使用 FixedFormatterFuncFormatter,这实际上允许您自由选择刻度值(前者可以使用间接选择 plt.gca().set_xticklabels)。但是,其中 none 允许您选择所谓的 offset_string,它是显示在轴末端的字符串,通常用于值偏移,但 ScalarFormatter 也将其用于科学乘数。

因此,我的最佳解决方案包括派生自 ScalarFormatter 的自定义格式化程序,其中不是自动检测数量级和格式字符串,而是由所用的固定:

from matplotlib import rcParams
import matplotlib.ticker

if 'axes.formatter.useoffset' in rcParams:
    # None triggers use of the rcParams value
    useoffsetdefault = None
else:
    # None would raise an exception
    useoffsetdefault = True

class FixedScalarFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, format, orderOfMagnitude=0, useOffset=useoffsetdefault, useMathText=None, useLocale=None):
        super(FixedScalarFormatter,self).__init__(useOffset=useOffset,useMathText=useMathText,useLocale=useLocale)
        self.base_format = format
        self.orderOfMagnitude = orderOfMagnitude

    def _set_orderOfMagnitude(self, range):
        """ Set orderOfMagnitude to best describe the specified data range.

        Does nothing except from preventing the parent class to do something.
        """
        pass

    def _set_format(self, vmin, vmax):
        """ Calculates the most appropriate format string for the range (vmin, vmax).

        We're actually just using a fixed format string.
        """
        self.format = self.base_format
        if self._usetex:
            self.format = '$%s$' % self.format
        elif self._useMathText:
            self.format = '$\mathdefault{%s}$' % self.format   

请注意,ScalarFormatter 的构造函数参数 useOffset 的默认值在某些时候发生了变化,我试图猜测哪一个是正确的。

将此 class 附加到绘图的一个或两个轴,如下所示:

plt.gca().xaxis.set_major_formatter(FixedScalarFormatter('%.2f',4))
plt.gca().yaxis.set_major_formatter(FixedScalarFormatter('%.2f',4))