我想制作一个分面网格,以变量名称为列,以部门为行,每个小图表是 y=value 和 x=date 的散点图
我的数据有点像这样:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from datetime import datetime
import matplotlib.dates as mdates
import random
datelist = pd.date_range(start="march 1 2020", end="may 20 2020", freq="w").tolist()
varlist = ["x", "y", "z", "x", "y", "z", "x", "y", "z", "x", "y", "z"]
deptlist = ["a", "a", "b", "a", "a", "b", "a", "a", "b", "a", "a", "b"]
vallist = random.sample(range(10, 30), 12)
df = pd.DataFrame({'date': datelist, 'value': vallist, 'variable': varlist, 'department': deptlist})
Run Code Online (Sandbox Code Playgroud)
我想制作一个分面网格,以变量名称为列,以部门为行,每个小图表是 y=value 和 x=date 的散点图
这是我到目前为止所拥有的。它几乎可以工作,除了我想看到底部的日期没有被压在一起,所以我想看到“3/1 4/1 5/1”而不是完整的日期。但我不知道如何格式化它。
plt.style.use('seaborn-darkgrid')
xformatter = mdates.DateFormatter("%m-%d")
g = sns.FacetGrid(df2, row="department", col="variable", sharey='row')
g = g.map(plt.plot, "date", "value", marker='o', markersize=0.7)
datelist = pd.date_range(start="march 1 2020", end="june 1 2020", freq="MS").tolist()
g.set(xticks=datelist)
Run Code Online (Sandbox Code Playgroud)
这非常接近,但请注意底部 x 轴上的日期。他们都挤在一起。这就是为什么我尝试使用特殊的日期格式化程序但无法让它工作。我真正想要的是每个日期显示为 mon-dd 并且我可以控制那里出现多少个刻度线。
您可以将 FacetGrid 的 Axes 对象作为g.axes(二维数组)访问。您可以迭代该数组并更改所有轴的属性,但在您的情况下sharex=True(默认),这意味着更改子图之一的 x 轴将同时更改所有子图。
g = sns.FacetGrid(df, row="department", col="variable", sharey='row')
g = g.map(plt.plot, "date", "value", marker='o', markersize=0.7)
xformatter = mdates.DateFormatter("%m/%d")
g.axes[0,0].xaxis.set_major_formatter(xformatter)
Run Code Online (Sandbox Code Playgroud)