2017-09-15 50 views
2

我想遮蔽Seaborn FacetGrid中兩條線之間的區域。該fill_between方法做到這一點,但我需要訪問每個插曲每一行的值,通過他們在Seaborn/Matplotlib:如何訪問FacetGrid中的行值?

這裏是我的代碼:

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,但文檔中沒有任何內容可以幫助。

回答

3

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()) 

代碼數據的輸出:

[<matplotlib.lines.Line2D object at 0x10c5facc0>, <matplotlib.lines.Line2D object at 0x10c5fa940>] 
['2011' '2016'] 
[ 0. -21.32] 
['2011' '2016'] 
[ 0. -34.84] 
[<matplotlib.lines.Line2D object at 0x10c39a160>, <matplotlib.lines.Line2D object at 0x10c5a4828>] 
['2011' '2016'] 
[ 0. 5.41] 
['2011' '2016'] 
[ 0. 19.15] 
[<matplotlib.lines.Line2D object at 0x10c5ff6d8>, <matplotlib.lines.Line2D object at 0x10c67c630>] 
['2011' '2016'] 
[ 0. -1.4] 
['2011' '2016'] 
[ 0. 61.42] 
[<matplotlib.lines.Line2D object at 0x10c637358>, <matplotlib.lines.Line2D object at 0x10c65ada0>] 
['2011' '2016'] 
[ 0. -20.38] 
['2011' '2016'] 
[ 0. -18.91] 
[<matplotlib.lines.Line2D object at 0x10c613668>, <matplotlib.lines.Line2D object at 0x10c6134e0>] 
['2011' '2016'] 
[ 0. -13.82] 
['2011' '2016'] 
[ 0. 7.41] 
[<matplotlib.lines.Line2D object at 0x10c5ffd30>, <matplotlib.lines.Line2D object at 0x10c4f5dd8>] 
['2011' '2016'] 
[ 0. -11.52] 
['2011' '2016'] 
[ 0. 6.57] 
+0

這是非常方便的,謝謝。在等待答案的同時,我還發現可以通過每個斧頭中的get_children()和get_data()來訪問數據值,但是您的解決方案要簡潔得多。 – robroc

2

擴展上@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