Bir Seaborn çizimi bir dosyaya nasıl kaydedilir


172

Aşağıdaki kodu ( test_seaborn.py) denedim :

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
import seaborn as sns
sns.set()
df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
fig = sns_plot.get_figure()
fig.savefig("output.png")
#sns.plt.show()

Ama bu hatayı alıyorum:

  Traceback (most recent call last):
  File "test_searborn.py", line 11, in <module>
    fig = sns_plot.get_figure()
AttributeError: 'PairGrid' object has no attribute 'get_figure'

Finalin output.pngvar olmasını ve şöyle görünmesini bekliyorum :

resim açıklamasını buraya girin

Sorunu nasıl çözebilirim?


1
@Terry Wang'ın aşağıdaki cevabı benim için çalıştı - Python 2.7.12veseaborn 0.7.1
Cristian E. Nuno

1
Tek astar seaborn 0.9:sns.regplot(x='age', y='income', data=pd.read_csv('income_data.csv')).get_figure().savefig('income_f_age.png')
Anton Tarasenko

Yanıtlar:


130

Çıkarın get_figureve kullanınsns_plot.savefig('output.png')

df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
sns_plot.savefig("output.png")

38
Bunun Seaborn 0.7.1'de çalışmadığını lütfen unutmayın (diğer cevaba bakınız).
Guido

31
Bu cevabın kabul edilmesine rağmen modası geçmiş olduğuna dikkat edin . Doğru cevap burada Salvatore tarafından verilen
Gabriel

1
2020'de Hata:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx

237

Önerilen çözümler Seaborn 0.8.1 ile uyumsuz

Seaborn arayüzü değiştiği için aşağıdaki hataları verir:

AttributeError: 'AxesSubplot' object has no attribute 'fig'
When trying to access the figure

AttributeError: 'AxesSubplot' object has no attribute 'savefig'
when trying to use the savefig directly as a function

Aşağıdaki çağrılar rakama erişmenizi sağlar (Seaborn 0.8.1 uyumlu):

swarm_plot = sns.swarmplot(...)
fig = swarm_plot.get_figure()
fig.savefig(...) 

Bu cevapta daha önce görüldüğü gibi .

GÜNCELLEME: Son zamanlarda bu örnekteki gibi bir çizim oluşturmak için deniz dibinden PairGrid nesnesini kullandım . Bu durumda, GridPlot, örneğin sns.swarmplot gibi bir çizim nesnesi olmadığından, get_figure () işlevi yoktur. Matplotlib şekline doğrudan erişmek mümkündür.

fig = myGridPlotObject.fig

Bu konudaki diğer yayınlarda daha önce önerildiği gibi.


2
Son zamanlarda örnekte olduğu gibi seaborn'dan PairGrid nesnesini kullandım
Salvatore Cosentino

2
Bu PairGrid ve JointGrid için de çalışan tek cevap, bence kabul edilmelidir.
Ryszard Cetnarski

41

Yukarıdaki çözümlerden bazıları benim için işe yaramadı. .figBunu denedim ve ben kullanmak mümkün iken nitelik bulunamadı .savefig()doğrudan. Ancak, işe yarayan şey şuydu:

sns_plot.figure.savefig("output.png")

Ben daha yeni bir Python kullanıcısıyım, bu yüzden bunun bir güncellemeden kaynaklanıp kaynaklanmadığını bilmiyorum. Başkalarının benimle aynı meselelerle karşılaşması durumunda bundan bahsetmek istedim.


1
Bu benim için bir ile çalıştı seaborn.swarmplot, ama bunun için seaborn.lmplotişe yaramaz. İle seaborn.lmplot, sns_plot.savefig("output.png")Salvatore'nin cevabında olduğu gibi çalıştım, ancak get_figure()aramaya gerek kalmadan buldum .
Wayne

14

Sadece doğrudan savefigyöntemi kullanabilirsiniz sns_plot.

sns_plot.savefig("output.png")

sns_plotİçinde bulunan matplotlib şekline erişmek istiyorsanız, kodunuzla anlaşılır olmak için doğrudan

fig = sns_plot.fig

Bu durumda get_figure, kodunuzun varsaydığı gibi bir yöntem yoktur .


9

Resmi başarıyla kaydetmek için distplotve get_figuretuşlarını kullanıyorum.

sns_hist = sns.distplot(df_train['SalePrice'])
fig = sns_hist.get_figure()
fig.savefig('hist.png')

Benim çevre için çalıştı: işlevini sns.distplot()de python 3.5.6sahip seaborn 0.9.0. Ayrıca, fonksiyonun sns.pairplot()çizgisine ihtiyacı yokget_figure()
Scott Yang

9

2019 araştırmacıları için daha az satır:

import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', height=2.5)
plt.savefig('output.png')

GÜNCELLEME NOT: sizeolarak değiştirildi height.


3

Bu benim için çalışıyor

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

sns.factorplot(x='holiday',data=data,kind='count',size=5,aspect=1)
plt.savefig('holiday-vs-count.png')

3

Ayrıca bir matplotlib figurenesnesi oluşturmak ve sonra kullanmak mümkündür plt.savefig(...):

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

df = sns.load_dataset('iris')
plt.figure() # Push new figure on stack
sns_plot = sns.pairplot(df, hue='species', size=2.5)
plt.savefig('output.png') # Save that figure

1

sns.figure.savefig("output.png")Deniz dibinin 0.8.1'inde kullanmak için bir hata alırsınız .

Bunun yerine kullanın:

import seaborn as sns

df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
sns_plot.savefig("output.png")

-4

Sadece FYI, aşağıdaki komut deniz dibi 0.8.1'de çalıştı, bu yüzden ilk cevap hala geçerli.

sns_plot = sns.pairplot(data, hue='species', size=3)
sns_plot.savefig("output.png")

Bu kod çalışıyor olsa da, tam değil. Başlık, daha genel olan 'Seaborn grafiğini bir dosyaya nasıl kaydeder' diyor. Ne yazık ki önerilen çözüm çift parsel ile çalışır, ancak diğer 'türler' ile bir istisna oluşturur. Umarım gelecekteki sürümlerde 'figür' nesneyi deniz dibinden elde etmenin daha birleşik bir yolu olacaktır.
Salvatore Cosentino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.