Seaborn/Matplotlib:如何访问FacetGrid中的行值?

2024-06-17 10:34:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在Seaborn FaceGrid中对两条线之间的区域进行着色。fill_between方法可以做到这一点,但是我需要访问每个子批中每一行的值来传递它们。在

我的代码是:

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

data = [{'Change': 0.0,  'Language': 'Algonquin',  'Type': 'Mother tongue',  'Year': '2011'}, {'Change': 0.0,  'Language': 'Algonquin',  'Type': 'Spoken at home',  'Year': '2011'}, {'Change': -21.32,  'Language': 'Algonquin',  'Type': 'Mother tongue',  'Year': '2016'}, {'Change': -34.84,  'Language': 'Algonquin',  'Type': 'Spoken at home',  'Year': '2016'}, {'Change': 0.0,  'Language': 'Atikamekw',  'Type': 'Mother tongue',  'Year': '2011'}, {'Change': 0.0,  'Language': 'Atikamekw',  'Type': 'Spoken at home',  'Year': '2011'}, {'Change': 5.41,  'Language': 'Atikamekw',  'Type': 'Mother tongue',  'Year': '2016'}, {'Change': 19.15,  'Language': 'Atikamekw',  'Type': 'Spoken at home',  'Year': '2016'}, {'Change': 0.0,  'Language': 'Blackfoot',  'Type': 'Mother tongue',  'Year': '2011'}, {'Change': 0.0,  'Language': 'Blackfoot',  'Type': 'Spoken at home',  'Year': '2011'}, {'Change': -1.4,  'Language': 'Blackfoot',  'Type': 'Mother tongue',  'Year': '2016'}, {'Change': 61.42,  'Language': 'Blackfoot',  'Type': 'Spoken at home',  'Year': '2016'}, {'Change': 0.0,  'Language': 'Carrier',  'Type': 'Mother tongue',  'Year': '2011'}, {'Change': 0.0,  'Language': 'Carrier',  'Type': 'Spoken at home',  'Year': '2011'}, {'Change': -20.38,  'Language': 'Carrier',  'Type': 'Mother tongue',  'Year': '2016'}, {'Change': -18.91,  'Language': 'Carrier',  'Type': 'Spoken at home',  'Year': '2016'}, {'Change': 0.0,  'Language': 'Chilcotin',  'Type': 'Mother tongue',  'Year': '2011'}, {'Change': 0.0,  'Language': 'Chilcotin',  'Type': 'Spoken at home',  'Year': '2011'}, {'Change': -13.82,  'Language': 'Chilcotin',  'Type': 'Mother tongue',  'Year': '2016'}, {'Change': 7.41,  'Language': 'Chilcotin',  'Type': 'Spoken at home',  'Year': '2016'}, {'Change': 0.0,  'Language': 'Cree languages',  'Type': 'Mother tongue',  'Year': '2011'}, {'Change': 0.0,  'Language': 'Cree languages',  'Type': 'Spoken at home',  'Year': '2011'}, {'Change': -11.52,  'Language': 'Cree languages',  'Type': 'Mother tongue',  'Year': '2016'}, {'Change': 6.57,  'Language': 'Cree languages',  'Type': 'Spoken at home',  'Year': '2016'}]

langs = pd.DataFrame(data)
g = sns.FacetGrid(langs, col='Language', hue='Type', col_wrap = 4, size=2)
g.map(plt.plot, 'Year', 'Change').set_titles('{col_name}')
g.set(xticks=[2011, 2016], yticks = [-40, 0, 70] )

这将生成如下图表: enter image description here

现在如何访问每行的值?我猜是用g.axes来猜的,但是文档中没有任何东西能帮上忙。在


Tags: hometypechangeyearlanguageatcarriermother
2条回答

FacetGrid的平面轴数组,然后通过ax.lines获取轴对象的所有行。使用get_xdata, get_ydata的调用迭代这些行,以请求某行的数据,而不是对这些数据执行所需的操作。 样本代码:

...
for ax in g.axes.flat:
    print (ax.lines)
    for line in ax.lines:
        print (line.get_xdata())
        print (line.get_ydata())

代码数据的输出:

^{pr2}$

@Serenity's上扩展。使用行信息get_xdata, get_ydata您可以使用fill_between之类的

g = sns.FacetGrid(langs, col='Language', hue='Type', col_wrap=4, size=3)
g.map(plt.plot, 'Year', 'Change').set_titles('{col_name}')
g.set(xticks=[2011, 2016], yticks = [-40, 0, 70] )
for ax in g.axes.flat:
    ax.fill_between(ax.lines[0].get_xdata().astype(int),
                    ax.lines[0].get_ydata(0), ax.lines[1].get_ydata(),
                    facecolor='#ffdec1')

enter image description here

相关问题 更多 >