【问题标题】:Show scatter plot title from column value从列值显示散点图标题
【发布时间】:2021-04-06 05:40:33
【问题描述】:

我正在使用我的数据框示例中的回归制作自动散点图

我想通过 Column1 在单独的散点图组中将 Column2 与 Column3 以及 Column2 与 Column4 关联起来。例如,Column2 到 Column3 会有 3 个散点图,每个散点图的标题分别为 A、B 和 C

对于绘图我使用熊猫散点图例如:

df.groupby('Column1').plot.scatter(x='Column2',y='Column3')

散点图正好返回 3 个图,但我想知道如何根据 Column1 的分组添加图表标题以及如何添加回归线。我还没有使用 seaborn 或 matplotlib,因为这对我来说很困惑,所以如果你能解释更多,我很感激:))

编辑 1

抱歉之前没有说清楚。我的代码以前运行良好,但输出如下。

没关系,但很难看哪个情节属于哪个组。因此我的意图是创造这样的东西

编辑 2

向所有热心帮助的人致敬。凯娜特别帮了我很多,也对他大喊大叫。

这是他根据评论的几个补充写的代码。

fig, axes = plt.subplots(1, df.Column1.nunique(), figsize=(12,8))

groups = df.groupby('Column1')
fig.tight_layout(pad=3)

# If `fig.tight_layout(pad=3)` does not work:
# plt.subplots_adjust(wspace=0.5) 

for i, (gname, gdata) in enumerate(groups):
    sns.regplot(x='Column2', y='Column3', data=gdata, ax=axes[i])
    axes[i].set_title(gname)
    axes[i].set_ylim(0,)

这是我的结果图

标题和轴工作得很好。由于我得到了剧情的帮助,因此可以认为该线程已关闭。

但正如您所看到的,底部图的显示很奇怪,因为它还显示了从 0 到 600 的 x 轴和从 0 到 25 的 y,尽管它们都应该具有相同的 y 轴格式。对于另一个图表,它们也被水平拉伸。

我正在尝试使用 here 方法,但使用参数 squareequal 并没有真正成功

我可以进一步询问如何调整轴以使绘图成为正方形吗?谢谢!

【问题讨论】:

  • 你可以给plt.title{'A')获取标题
  • 是的,但是这会返回所有情节都具有与标题相同的标题 A 并不认为子情节不同
  • 您可以尝试几个选项。查看可视化文档pandas.pydata.org/pandas-docs/stable/user_guide/…
  • 您能否分享导致 x 和 y 出现这种差异的代码。我的图表看起来不一样了

标签: python pandas matplotlib seaborn


【解决方案1】:

您可以遍历您的组,指定标题:

fig, axes = plt.subplots(1, df.Column1.nunique(), figsize=(12,8))

groups = df.groupby('Column1')

for i, (gname, gdata) in enumerate(groups):
    sns.regplot(x='Column2', y='Column3', data=gdata, ax=axes[i]).set_title(gname)

你也可以直接使用seaborn.FacetGrid

g = sns.FacetGrid(df, col='Column1')
g.map(sns.regplot, 'Column2', 'Column2')

编辑(根据 cmets 中的新要求进一步定制):

fig, axes = plt.subplots(1, df.Column1.nunique(), figsize=(12,8))

groups = df.groupby('Column1')
fig.tight_layout(pad=3)

# If `fig.tight_layout(pad=3)` does not work:
# plt.subplots_adjust(wspace=0.5) 

for i, (gname, gdata) in enumerate(groups):
    sns.regplot(x='Column2', y='Column3', data=gdata, ax=axes[i])
    axes[i].set_title(gname)
    axes[i].set_ylim(0,)

【讨论】:

  • 您好,非常感谢!这就是我需要的。但是对于这两种情况,您是否知道不是水平显示而是垂直显示?我的实际数据对于 Column1 的输入很长,例如 'AAAAAAAAAAAAAAA' 和 'BBBBBBBBBBBBBB' 但命名相互重叠
  • rotation=90 作为参数添加到set_title 方法。和g.set_titles(rotation=90)seaborn.FacetGrid
  • 嗨,Caina,谢谢!我决定坚持迭代,旋转效果很好!但我意识到对于这两种情况,轴都是出路(我的数据可能非常小,如 1.104 和 1.11,但 y 轴范围从 -15 到 15)。我可以知道是否有办法让 y 轴从 0 开始并增加绘图之间的水平间距?我尝试在 sns regplot 中使用fig_size(),但它只会使尺寸变小,而不是改变轴。如果您回答此问题,请感谢!
  • 嗨@choohoo。乐意效劳!使用fig.tight_layout(pad=3) 增加绘图之间的空间(使用其他值),并在for 循环中使用axes[i].set_ylim(0,) 将0 设置为y 轴的起点。您也可以考虑制作多行子图以获得更好的可视化效果。
  • 第一个问题可能与你的身材宽度有关(见this answer)。尝试在figsize 参数中增加它(第一个值是宽度)。否则,只需使用 plt.subplots_adjust 取消注释更新的代码。关于ylim,不要将其分配回斧头。看看更新的答案。最好的!
【解决方案2】:

这就是我所做的。你可以试试这样的。

fig, axes = plt.subplots(ncols=3,figsize=(12,6))
plt.subplots_adjust(wspace=0.5, hspace=0.3)
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[0])
axes[0].set_title("A")
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[1])
axes[1].set_title("B")
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[2])
axes[2].set_title("C")
plt.show()

这个的输出是:

如果您想垂直查看答案,请将 ncols 更改为 nrows 并修复 figsize。

fig, axes = plt.subplots(nrows=3,figsize=(3,12))
plt.subplots_adjust(wspace=0.2, hspace=.5)
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[0])
axes[0].set_title("A")
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[1])
axes[1].set_title("B")
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[2])
axes[2].set_title("C")
plt.show()

这会给你:

【讨论】:

  • 嗨乔!谢谢你的回答。您的方法绝对很棒,特别是对于如何调整间距和垂直。但是,它不是最适合我的,因为我们需要手动分配每个标题。
【解决方案3】:

您还可以使用 seaborn 内置功能。如果您想查看相关性,您可以执行df.corr()

import seaborn as sns
sns.heatmap(df.corr(),annot=True) # This is HeatMap

您也可以使用pairplot

sns.set_style('whitegrid')
sns.set(rc={'figure.figsize':(13.7,10.27)})
sns.set(font_scale=1.3)
sns.set_palette("cubehelix",8)
sns.pairplot(df)

【讨论】:

  • 您好,杰伊,谢谢您的回答!是的,我以前做过,但我意识到这不是我想要显示我的情节的格式,因此我尝试了另一种方法。抱歉误解了我的问题:))
猜你喜欢
  • 2021-02-07
  • 2021-11-04
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 2014-12-08
  • 2019-12-03
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多