使用 Seaborn FacetGrid 格式化日期标签

7
我希望制作一个分面网格,列为变量名称,行为部门,每个小图表都是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})

我想制作一个多面板网格图,变量名为列,部门为行,每个小图表都是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)

enter image description here

这很接近了,但请注意底部x轴上的日期。它们都挤在一起了。这就是为什么我尝试使用特殊的日期格式化程序,但无法使其工作的原因。实际上,我希望每个日期显示为“月-日”,并且我可以控制出现的刻度标记数量。
1个回答

6

您可以通过g.axes(一个二维数组)访问FacetGrid的Axes对象。您可以遍历此数组并更改所有轴的属性,但在您的情况下,您具有sharex=True(默认值),这意味着更改其中一个子图的x轴将同时更改所有子图的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)

enter image description here


谢谢!天才 :) - pitosalas
顺便说一下,我一直忽略这个消息,但它是什么意思?"/usr/local/lib/python3.7/site-packages/pandas/plotting/_matplotlib/converter.py:103: FutureWarning: Using an implicitly registered datetime converter for a matplotlib plotting method. The converter was registered by pandas on import. Future versions of pandas will require you to explicitly register matplotlib converters.要注册转换器:
from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() warnings.warn(msg, FutureWarning)"
- pitosalas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接