【问题标题】:Log-log lmplot with seaborn使用 seaborn 对数对数 lmplot
【发布时间】:2014-07-17 18:24:38
【问题描述】:

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)

【问题讨论】:

  • 如果不使用构面,使用seaborn.regplot会更容易。
  • 我有点困惑,因为您的代码绘制了两个图。你想用 seaborn 重现第一个情节吗?或者你想在第一个情节的顶部画lmplot
  • @mwaskom 第一个情节不应该在那里。我现在从代码中删除它。

标签: python seaborn


【解决方案1】:

从(可能)任何 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')

【讨论】:

    【解决方案2】:

    如果你只是想绘制一个简单的回归,使用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 and posy should be finite values.
    • 所有(错误放置的)白线是怎么回事?
    • @borgr 你说的错是什么意思?每行代表一个倍数:2 * 10^p, 4 * 10^p ... 用于 2 到 10 之间的所有偶数
    • 所以你有非对数图和对数图的线,取决于上下文,但它可能会令人困惑
    【解决方案3】:

    首先调用 seaborn 函数。它返回一个具有axes 属性的FacetGrid 对象(matplotlib 的二维numpy 数组Axes)。获取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')
    

    【讨论】:

    • 理论上它应该更简单,你可以做fgrid.set(xscale="log", yscale="log"),但由于一些matplotlib的怪异和lmplot的工作方式的结合,这并不能完全得到我们想要的。
    • 感谢@mwaskom 的参与。我也看到了你用我的例子描述的奇怪之处。
    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 2020-11-09
    • 2017-02-05
    • 2021-12-10
    • 2019-08-29
    • 2022-11-17
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多