Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
377 views
in Technique[技术] by (71.8m points)

python - Seaborn/Matplotlib: how to access line values in FacetGrid?

I'm trying to shade the area between two lines in a Seaborn FacetGrid. The fill_between method will do this, but I need to access the values of each line in each subplot to pass them in.

Here's my 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] )

This results in a chart like this: enter image description here

Now how do I access the values of each line? I'm guessing something with g.axes, but nothing in the docs is helping.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Flat axes array of FacetGrid then get all lines of an axis object by ax.lines. Iterate over these lines with calls of get_xdata, get_ydata to request data of a line than do what you want with these data. Sample code:

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

Output of your code data:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...