如何使用 seaborn 创建多线图?
Posted
技术标签:
【中文标题】如何使用 seaborn 创建多线图?【英文标题】:How do I create a multiline plot using seaborn? 【发布时间】:2019-02-17 21:30:28 【问题描述】:我正在尝试使用 Seaborn 使我的情节在视觉上比 matplotlib 更好。我有一个数据集,它有一个“年”列,我想在 X 轴上绘制,4 列使用不同颜色的线在 Y 轴上表示 A、B、C、D。我试图使用 sns.lineplot 方法来做到这一点,但它只允许 X 轴上的一个变量和 Y 轴上的一个变量。我试过这样做
sns.lineplot(data_preproc['Year'],data_preproc['A'], err_style=None)
sns.lineplot(data_preproc['Year'],data_preproc['B'], err_style=None)
sns.lineplot(data_preproc['Year'],data_preproc['C'], err_style=None)
sns.lineplot(data_preproc['Year'],data_preproc['D'], err_style=None)
但是这样我就不会在情节中得到一个图例来显示哪条彩色线对应于什么。我尝试检查文档,但找不到合适的方法。
【问题讨论】:
【参考方案1】:Seaborn 倾向于使用“长格式”作为输入。将 DataFrame 从其“宽格式”(每种测量类型一列)转换为长格式(所有测量值一列,一列指示类型)的关键要素是 pandas.melt。给定一个像你一样的data_preproc
,用随机值填充:
num_rows = 20
years = list(range(1990, 1990 + num_rows))
data_preproc = pd.DataFrame(
'Year': years,
'A': np.random.randn(num_rows).cumsum(),
'B': np.random.randn(num_rows).cumsum(),
'C': np.random.randn(num_rows).cumsum(),
'D': np.random.randn(num_rows).cumsum())
使用以下方法获得具有四条线(每种测量类型一条)的单图
sns.lineplot(x='Year', y='value', hue='variable',
data=pd.melt(data_preproc, ['Year']))
(注意'value'和'variable'是melt
返回的默认列名,可以根据自己的喜好调整。)
【讨论】:
【参考方案2】:见the documentation:
sns.lineplot(x="Year", y="signal", hue="label", data=data_preproc)
您可能需要以合适的方式重新组织您的数据框,以便有一列用于 x 数据,一列用于 y 数据,另一列用于保存数据点的标签。
您也可以只使用matplotlib.pyplot
。如果您导入seaborn
,大部分改进的设计也用于“常规”matplotlib 图。 Seaborn 实际上“只是”一组方法,可以方便地将数据和绘图参数提供给 matplotlib。
【讨论】:
【参考方案3】:这个:
sns.lineplot(data=data_preproc)
会做你想做的。
【讨论】:
你是对的。但这应该在@dnswlt 的回答中提到不需要更改数据框 如果您解释了您提供的代码如何回答问题,这将是一个更好的答案。以上是关于如何使用 seaborn 创建多线图?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Seaborn 创建 FacetGrid 堆叠条形图?