使用seaborn绘制log-log lmplot

52
Seaborn的lmplot能在对数-对数坐标轴上绘图吗?
这是带有线性坐标轴的lmplot:
import numpy as np
import pandas as pd
import seaborn as sns
x =  10**arange(1, 10)
y = 10** arange(1,10)*2
df1 = pd.DataFrame( data=y, index=x )
df2 = pd.DataFrame(data = {'x': x, 'y': y}) 
sns.lmplot('x', 'y', df2)

![sns.lmplot('x', 'y', df2)][2] [2]: https://istack.dev59.com/FXbtg.webp


1
如果您没有使用facets,那么使用seaborn.regplot会更容易。 - mwaskom
我有点困惑,因为你的代码绘制了两个图。你是想用seaborn重现第一个图吗?还是你想在第一个图的基础上绘制lmplot - mwaskom
@mwaskom 第一个图应该不在那里。我现在从代码中删除它。 - sjdh
4个回答

76

如果您只想绘制一个简单的回归图,使用seaborn.regplot会更容易。这似乎可以工作(尽管我不确定y轴次要网格线的位置)

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

x = 10 ** np.arange(1, 10)
y = x * 2
data = pd.DataFrame(data={'x': x, 'y': y})

f, ax = plt.subplots(figsize=(7, 7))
ax.set(xscale="log", yscale="log")
sns.regplot("x", "y", data, ax=ax, scatter_kws={"s": 100})

在此输入图片描述

如果您需要使用lmplot进行其他用途,这是我想到的,但我不确定x轴刻度发生了什么。 如果有人有想法并且这是seaborn中的错误,我很乐意修复它:

grid = sns.lmplot('x', 'y', data, size=7, truncate=True, scatter_kws={"s": 100})
grid.set(xscale="log", yscale="log")

在此输入图片描述


使用这段代码时,我得到了以下错误:ValueError: posx和posy应该是有限的值。 - Archie
所有(错误放置的)白线是怎么回事? - borgr
1
@borgr你说的“错误”是什么意思?每一行代表一个倍数:2 * 10^p,4 * 10^p ... 对于2到10之间的所有偶数。 - Marine Galantin
所以你有非对数图和对数图的线条,这取决于上下文,但可能会令人困惑。 - borgr

13

从(可能是)任何 seaborn 绘图制作对数-对数图的最简单方法是:

plt.xscale('log')
plt.yscale('log')
在这个例子中:

import numpy as np
import pandas as pd
import seaborn as sns
x =  10**np.arange(1, 10)
y = 10** np.arange(1,10)*2
df1 = pd.DataFrame( data=y, index=x )
df2 = pd.DataFrame(data = {'x': x, 'y': y}) 
sns.lmplot('x', 'y', df2)
plt.xscale('log')
plt.yscale('log')

生成图片的链接


6

首先调用seaborn函数,它会返回一个FacetGrid对象,其中包含一个axes属性(一个matplotlib Axes的2维numpy数组)。获取Axes对象并将其传递给对df1.plot的调用。

import numpy as np
import pandas as pd
import seaborn as sns

x =  10**np.arange(1, 10)
y = 10**np.arange(1,10)*2
df1 = pd.DataFrame(data=y, index=x)
df2 = pd.DataFrame(data = {'x': x, 'y': y})

fgrid = sns.lmplot('x', 'y', df2)    
ax = fgrid.axes[0][0]
df1.plot(ax=ax)        

ax.set_xscale('log')
ax.set_yscale('log')

6
理论上应该更简单,你可以只需要执行fgrid.set(xscale="log", yscale="log"),但由于Matplotlib的一些奇怪行为和lmplot的工作方式的组合,这样做并不能完全得到我们想要的结果。 - mwaskom
谢谢你加入讨论,@mwaskom。我也看到了你描述的例子中的怪异现象。 - Paul H

0
一般情况下,在不明确使用 matplotlib 的情况下,可以在绘图函数的 facet_kws 参数中使用 subplot_kws 参数。
来自 seaborn 文档 https://seaborn.pydata.org/generated/seaborn.lmplot.html facet_kws: 字典 FacetGrid 的关键字参数字典。
示例:facet_kws={"subplot_kws": {"yscale": "log"}},用于在纵轴上使用对数刻度。 当然,请确保处理的数据为正数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接