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(默认格式化程序)提供科学格式,但是,它不允许固定有效数字的指数或数量。一种替代方法是使用 FixedFormatter
或FuncFormatter
,这实际上允许您自由选择刻度值(前者可以使用间接选择
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))
我已经编辑了我的问题,我相信这样更具有指导意义,
我正在使用 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(默认格式化程序)提供科学格式,但是,它不允许固定有效数字的指数或数量。一种替代方法是使用 FixedFormatter
或FuncFormatter
,这实际上允许您自由选择刻度值(前者可以使用间接选择
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))