我已经编辑了我的问题,我相信它更具说教性,
我正在使用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
答案 0 :(得分:1)
据我所知,matplotlib并没有提供开箱即用的选项。文档确实很稀疏(Ticker API是可以去的地方)。 Formatter类负责格式化tick值。在提供的内容中,只有ScalarFormatter(默认格式化程序)提供科学格式,但是,它不允许修改指数或有效位数。一种替代方法是使用FixedFormatter
或FuncFormatter
,这基本上允许您自由选择刻度值(前者可以间接选择使用
plt.gca().set_xticklabels
)。但是,它们都不允许您选择所谓的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
的默认值在某些时候发生了变化,我试图猜测哪一个是正确的。
将此类附加到绘图的一个或两个轴上,如下所示:
plt.gca().xaxis.set_major_formatter(FixedScalarFormatter('%.2f',4))
plt.gca().yaxis.set_major_formatter(FixedScalarFormatter('%.2f',4))