【问题标题】:Set line widths according to column for seaborn FacetGrid with lineplot根据带有线图的 seaborn FacetGrid 的列设置线宽
【发布时间】:2020-11-03 23:43:53
【问题描述】:

我想在 FacetGrid 的每个线图中挑选出特定的线,以突出显示与其他选项相比的“默认”设置。

我试图根据this random walk example in the seaborn documentation 做一个最小的例子


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

rs = np.random.RandomState(2020)
pos = rs.randint(-1, 2, (20, 5)).cumsum(axis=1)
pos -= pos[:, 0, np.newaxis]
step = np.tile(range(5), 20)
walk = np.repeat(range(20), 5)
df = pd.DataFrame(np.c_[pos.flat, step, walk],
                  columns=["position", "step", "walk"])
df["family"] = df["walk"] % 5
df["top"] = df.groupby("walk")["position"].transform("max")
df["importance"] = df["top"]+1
grid = sns.FacetGrid(df, col="family", col_wrap=3,  hue="walk")
grid.map_dataframe(sns.lineplot, "step", "position", marker="o")
grid.add_legend()

这给了我所有线条宽度相同的多面线图(当然):

我创建了一个名为importance 的额外列;我希望根据此列设置线宽。我可以看到,使用简单的seaborn.lineplot,您可以“分配size 语义以使用数字变量映射线条的宽度”。我曾尝试在 FacetGrid() 调用和 map_dataframe() 调用中使用 size=,但它不起作用。

例如,如果我改用这个:

grid = sns.FacetGrid(df, col="family", col_wrap=3,  hue="walk")
grid.map_dataframe(sns.lineplot, "step", "position",
                   size="importance", marker="o")
grid.add_legend()

我看不出线条粗细有什么不同,但现在图例也搞砸了:

【问题讨论】:

  • grid.map_dataframe(sns.lineplot, "step", "position", size='importance', marker="o") 如果将重要性设置为线图的大小会怎样?在我的环境中,图表是用不同的线宽绘制的。线宽的差异很微妙。
  • 我试过了,但看不出线宽有明显差异(应该很明显,介于 1 和 4 之间);但我确实把传说搞砸了。我会在问题中处理它以显示结果。
  • grid.map_dataframe(sns.lineplot, "step", "position", size='importance', marker="o", legend=False) 你可以试试这个
  • @r-beginners 不幸的是,结果仍然相同 - 所有行的宽度相同,但现在没有图例:pasteboard.co/JyD6FCc.png
  • https://pasteboard.co/JyDbKEJ.png我使用您提供的服务上传了图片。看起来很有用。

标签: python pandas seaborn


【解决方案1】:

您的问题是importance 在给定的hue 级别中是相同的,而sizes 似乎在hue 的级别上被规范化,因此它们最终都是相同的。但是,您可以将映射字典传递给sizes=,以将给定的size 匹配到特定的linewidth

sizes = {a:a for a in df['importance'].unique()}
{1: 1, 4: 4, 2: 2, 3: 3}
grid = sns.FacetGrid(df, col="family", col_wrap=3,  hue="walk", height=2)
grid.map_dataframe(sns.lineplot, "step", "position",
                   size="importance", marker="o", sizes=sizes)

【讨论】:

  • 是的!太好了,谢谢。出于某种原因,图例现在搞砸了,一些条目只显示为黑色且没有标记 - 这并不是一个真正的问题,因为我实际上并没有在我的真实图表中使用 marker='o' 设置。
  • 是的,我注意到了,但我不明白为什么传说会这样出现
猜你喜欢
  • 2019-08-01
  • 2018-12-28
  • 2021-11-05
  • 2016-12-31
  • 2020-09-10
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多