【问题标题】:Why do sns.lmplot and FacetGrid+plt.scatter create different scatter points from the same data?为什么 sns.lmplot 和 FacetGrid+plt.scatter 从相同的数据创建不同的散点?
【发布时间】:2015-07-31 05:16:21
【问题描述】:

我对 Python、pandas DataFrames 和 Seaborn 还是很陌生。当我试图更好地理解 Seaborn,尤其是 sns.lmplot 时,我发现了由相同数据组成的两个数字之间的差异,我认为这应该看起来很相似,我想知道为什么会这样。

数据:我的数据是一个有 454 行和 19 列的 pandas DataFrame。与此问题相关的数据包括 4 列,如下所示:

列:Av_density; pred2;本地化;年份;

变量类型:连续变量;连续变量;分类变量 1...4;分类 2012...2014

没有丢失的数据点。

我的目标是绘制一个 2x2 图形面板,分别描述每个 LOC(=位置)的 Av_density 和 pred2 之间的关系,并用不同颜色标记年份。我打电话给seaborn:

import seaborn as sns
sns.set(style="whitegrid")
np.random.seed(sum(map(ord, "linear_categorical")))

(支点:由于某种原因调用“linear_quantitative”不起作用,即我得到一个“文件“stdin”,第 2 行 sns.lmplot("Av_density", "pred2", Data, col="LOC", hue="YEAR", col_wrap=2);
^ SyntaxError: 无效语法")

图法一,FacetGrid + scatter:

sur=sns.FacetGrid(Data,col="LOC", col_wrap=2,hue="YEAR")
sur.map(plt.scatter, "Av_density", "pred2" );
plt.legend()

这会准确地产生很好的数据分散。你可以在这里看图:https://drive.google.com/file/d/0B7h2wsx9mUBScEdUbGRlRk5PV1E/view?usp=sharing

图法二,sns.lmplot:

sns.lmplot("Av_density", "pred2", Data, col="LOC", hue="YEAR", col_wrap=2);

这会生成按 LOC 准确划分的图形面板,其中年份以不同的颜色显示,但数据点的分散看起来不正确。相反,看起来 lmplot 已经线性化了数据点,并且除了回归线之外还丢失了它应该绘制的原始散点。 可以看这里的图:https://drive.google.com/file/d/0B7h2wsx9mUBSRkN5ZXhBeW9ob1E/view?usp=sharing

我的数据每年每个位置只产生三个点,我首先想知道这是否是导致 lmplot 数据点中“错误”的原因。理想情况下,我会用一条较短的线来描述年份之间的趋势,而不是适当的回归,但我还没有弄清楚代码。

但在解决这个问题之前,我真的很想知道我做错了什么可以修复,或者这是否是 lmplot 试图处理我的数据的问题?

热烈欢迎任何有关这方面的帮助、cmets 和想法!

-TA-

附言。我正在使用 Spyder 2.3.4 运行 Python 2.7.8

编辑: 我通过添加第一种方法得到更短的“趋势线”:

sur.map(plt.plot,"Av_density", "pred2" );

还是想知道是什么让 lmplot 弄乱了这个数字。

【问题讨论】:

  • 您是否尝试过使用参数fit_reg = False 来更好地查看 sns.lmplot 版本的绘图中的数据点?
  • 好建议,是的,我确实尝试过,然后散点看起来与第一种方法完全相同。这也是为什么我怀疑只回归 3 个数据点会在 lmplot 中搞砸一些东西......
  • 但是问题不在于添加回归(改变 y 轴上的比例)隐藏了数据点的可变性(因此看不到散点)?
  • 是的!事实上,我完全错过了第二种方法的规模。设置 ylim 和 xlim 效果很好!谢谢!

标签: python pandas matplotlib spyder seaborn


【解决方案1】:

问题可能只是添加的回归线弄乱了 y 轴,因此无法看到数据的可变性。 尝试根据原始图中的可变性重置 y 轴,以查看它们是否显示相同的内容,例如在您的情况下

fig1 = sns.lmplot("Av_density", "pred2", Data, col="LOC", hue="YEAR", col_wrap=2);
fig1.set(ylim=(-0.03, 0.05))
plt.show(fig1)

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2020-02-23
    • 2022-01-23
    • 1970-01-01
    • 2011-08-07
    • 2019-11-10
    • 2016-07-31
    • 2023-02-06
    相关资源
    最近更新 更多