2017-09-15 2 views
2

Ich versuche, den Bereich zwischen zwei Linien in einem Seaborn FacetGrid zu schattieren. Die fill_between Methode wird dies tun, aber ich brauche in jedem subplot die Werte jeder Zeile für den Zugriff auf sie in weitergebenSeaborn/Matplotlib: Wie kann man auf Linienwerte in FacetGrid zugreifen?

Hier ist mein Code:.

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

Daraus ergibt sich ein Diagramm wie folgt aus: enter image description here

Wie kann ich nun auf die Werte jeder Zeile zugreifen? Ich vermute etwas mit g.axes, aber nichts in der Dokumentation hilft.

Antwort

3

Flachachsen Array von FacetGrid erhalten dann alle Linien eines Achsenobjekts von ax.lines. Iterieren Sie diese Zeilen mit den Aufrufen von get_xdata, get_ydata, um Daten einer Zeile anzufordern, die Sie mit diesen Daten ausführen möchten. Beispielcode:

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

Ausgabe Ihrer Codedaten:

[<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

Diese sehr praktisch nutzen können, danke. Während ich auf eine Antwort wartete, fand ich auch, dass die Datenwerte über 'get_children()' und 'get_data()' in jeder Axt erreicht werden können, aber Ihre Lösung ist viel prägnanter. – robroc

2

Erweiterung auf @Serenity's. Mit Linieninformationen get_xdata, get_ydata Sie fill_between wie

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

Verwandte Themen