如何向seaborn FacetGrid的每个子图添加单独的vlines

问题描述

我想在每个子图中添加一条垂直线来标记每个产品的单独发布日期。每条垂直线都应显示日期。但我太初学者了,无法弄清楚这一点。我以 .axvline 为例:

Facet Grid of Products

代码如下:

g = sns.FacetGrid(df2,col='Product',hue='vendor',col_wrap=4,height=3.5)
g = g.map(plt.plot,'Date','Volumes')
g = g.map(plt.fill_between,'Volumes',alpha=0.2).set_titles("{col_name} Product")
g = g.set_titles("{col_name}")
g = g.set(xticks=[0,12,23])
g = g.set(xlabel='')

plt.axvline(x='Apr 19',color='r',linestyle=':')

我发现了以下方法,但我无法真正理解它,或将其应用于我自己的目的:

Marking specific dates when visualizing a time series

Add vertical lines to Seaborn Facet Grid plots based on the occurrence of an event

我创建了两个包含产品名称和相应发布日期的列表:

product_names = ['Product A','Product B','Product C','Product D','Product E','Product F','Product G','Product H','Product I','Product J',]

launch_dates = ['2019-02-01','2019-09-01','2019-12-01','2020-02-01','2020-05-01','2020-07-01','2020-08-01','2020-07-15']

launch_dates = [datetime.strptime(d,"%Y-%m-%d") for d in launch_dates]

那么,如何遍历所有方面以添加提到的垂直线?

解决方法

您可以使用 axes 访问 FacetGridg.axes.flat 对象,并在给定的 x 位置或从每个单独方面的列表中为每个对象添加一行:

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")

g = sns.FacetGrid(tips,col="time",row="sex")
g.map_dataframe(sns.histplot,x="total_bill",binwidth=2)
g.set_axis_labels("Total bill","Count")

line_position = [14,23,11,39]

for ax,pos in zip(g.axes.flat,line_position):
    ax.axvline(x=pos,color='r',linestyle=':')

plt.tight_layout()
plt.show()

示例输出:

enter image description here