Seaborn结合Pandas:regplot设置单轴对数刻度无需修改原数据框的方法
你当前的代码本身就没有修改输入的DataFrame,如果你的核心诉求是让回归拟合逻辑基于对数变换后的y值(而非仅修改轴的显示刻度,拟合逻辑仍使用原始y值),可以参考以下解决方案,全程不需要改动原DataFrame:
1. 对数刻度适配回归的实现
seaborn 0.12及以上版本的regplot自带x_transform/y_transform参数,可直接指定拟合时对坐标轴数据的变换,无需修改原数据:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt x = np.arange(1, 10) y = 10 ** np.arange(1, 10) data = pd.DataFrame(data={'x': x, 'y': y}) f, ax = plt.subplots(figsize=(6, 6)) sns.regplot( x="x", y="y", data=data, ax=ax, y_transform=np.log10 # 拟合时自动对y做log10变换,不需要存到DataFrame ) ax.set_yscale("log") # 保持y轴为对数刻度显示即可 plt.show()
如果你使用的是旧版本seaborn,也可以直接传入临时计算后的序列,不需要把变换后的值存入原DataFrame:
# 直接传入计算后的y值序列,不修改原data sns.regplot(x=data['x'], y=np.log10(data['y']), ax=ax) ax.set_ylabel('y (log10)') ax.set_yscale("log")
2. 自定义数据变换支持
上述的x_transform/y_transform参数本身就支持传入任意自定义函数,不局限于对数变换:
- 可以直接传入numpy内置函数,比如平方根变换
y_transform=np.sqrt - 也可以传入自定义的变换逻辑,示例如下:
# 自定义变换:先取平方根再加1 def custom_trans(x): return np.sqrt(x) + 1 # 绘图时直接传入即可 sns.regplot( x="x", y="y", data=data, ax=ax, y_transform=custom_trans )
内容的提问来源于stack exchange,提问作者fransua
相关产品推荐
相关产品推荐

