วิธีบันทึกพล็อตของ Seaborn ลงในไฟล์


172

ฉันลองรหัสต่อไปนี้ ( test_seaborn.py):

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

แต่ฉันได้รับข้อผิดพลาดนี้:

  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'

ฉันคาดว่ารอบชิงชนะเลิศoutput.pngจะมีอยู่และมีลักษณะเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะแก้ไขปัญหาได้อย่างไร


1
คำตอบของ @Terry Wang ด้านล่างใช้ได้กับฉัน - Python 2.7.12และseaborn 0.7.1
Cristian E. Nuno

1
สายการบินเดียวสำหรับ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

คำตอบ:


130

ลบget_figureและเพียงใช้sns_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
โปรดทราบว่าสิ่งนี้ไม่สามารถใช้งานได้ใน Seaborn 0.7.1 (ดูคำตอบอื่น)
กุยโด

31
ขอให้สังเกตว่าคำตอบนี้แม้ว่าจะได้รับการยอมรับล้าสมัยแล้ว คำตอบที่ถูกต้องคือที่Salvatore มอบให้ที่นี่
Gabriel

1
ข้อผิดพลาดในปี 2020:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx

237

วิธีแก้ปัญหาที่แนะนำนั้นเข้ากันไม่ได้กับ Seaborn 0.8.1

ให้ข้อผิดพลาดต่อไปนี้เนื่องจากอินเทอร์เฟซ Seaborn มีการเปลี่ยนแปลง:

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

การโทรต่อไปนี้ช่วยให้คุณสามารถเข้าถึงรูป (เข้ากันได้กับ Seaborn 0.8.1):

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

เท่าที่เห็นก่อนหน้านี้ในคำตอบนี้

ปรับปรุง: ฉันเพิ่งใช้วัตถุ PairGrid จากทะเลเพื่อสร้างพล็อตที่คล้ายกับหนึ่งในตัวอย่างนี้ ในกรณีนี้เนื่องจาก GridPlot ไม่ใช่วัตถุพล็อตเช่น sns.swarmplot จึงไม่มีฟังก์ชั่น get_figure () สามารถเข้าถึงรูป matplotlib ได้โดยตรง

fig = myGridPlotObject.fig

เหมือนที่แนะนำก่อนหน้านี้ในโพสต์อื่น ๆ ในกระทู้นี้


2
ฉันเพิ่งใช้วัตถุ PairGrid จากทะเลในตัวอย่าง
Salvatore Cosentino

2
นี่เป็นคำตอบเดียวที่ใช้ได้กับ PairGrid และ JointGrid เช่นกันฉันคิดว่าควรได้รับการยอมรับ
Ryszard Cetnarski

41

การแก้ปัญหาข้างต้นบางอย่างไม่ได้ผลสำหรับฉัน .figแอตทริบิวต์ไม่พบเมื่อฉันพยายามที่และผมก็ไม่สามารถที่จะใช้.savefig()โดยตรง อย่างไรก็ตามสิ่งที่ได้ผลคือ:

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

ฉันเป็นผู้ใช้ Python ที่ใหม่กว่าดังนั้นฉันไม่รู้ว่านี่เป็นเพราะการอัปเดตหรือไม่ ฉันอยากจะพูดถึงมันในกรณีที่คนอื่นพบปัญหาเดียวกันกับที่ฉันทำ


1
สิ่งนี้ใช้ได้กับฉันด้วยseaborn.swarmplotแต่seaborn.lmplotนั่นไม่ได้ผล ด้วยseaborn.lmplotฉันพบว่าsns_plot.savefig("output.png")ทำงานเหมือนในคำตอบของ Salvatore แต่ไม่จำเป็นต้องget_figure()โทรหา
เวย์น

14

คุณควรจะสามารถใช้savefigวิธีการsns_plotได้โดยตรง

sns_plot.savefig("output.png")

เพื่อความชัดเจนกับรหัสของคุณหากคุณไม่ต้องการเข้าถึงรูป matplotlib ที่มีsns_plotอยู่ในนั้นคุณสามารถรับมันโดยตรงด้วย

fig = sns_plot.fig

ในกรณีนี้ไม่มีget_figureวิธีการที่เป็นรหัสของคุณถือว่า


9

ฉันใช้distplotและget_figureเพื่อบันทึกภาพสำเร็จ

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

ทำงานให้กับสภาพแวดล้อมของฉัน: ฟังก์ชั่นsns.distplot()ใน ด้วยpython 3.5.6 seaborn 0.9.0นอกจากนี้ฟังก์ชั่นsns.pairplot()ไม่จำเป็นต้องมีบรรทัดget_figure()
สกอตต์หยาง

9

ลดจำนวนบรรทัดสำหรับผู้ค้นหา 2019:

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

UPDATE หมายเหตุ: ก็เปลี่ยนไปsizeheight


3

มันใช้งานได้สำหรับฉัน

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

เป็นไปได้ที่จะสร้างfigureวัตถุmatplotlib จากนั้นใช้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")ในการใช้งานในท้องทะเล 0.8.1

ใช้แทน:

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

เพียงแค่ FYI คำสั่งด้านล่างทำงานในทะเล 0.8.1 ดังนั้นฉันเดาว่าคำตอบเริ่มต้นยังคงใช้ได้

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

แม้ว่ารหัสนั้นทำงานได้ แต่ก็ยังไม่สมบูรณ์ ชื่อกล่าวว่า 'วิธีบันทึกพล็อตซีบอนด์ลงในไฟล์' ซึ่งเป็นเรื่องทั่วไปมากขึ้น โชคไม่ดีที่โซลูชันที่นำเสนอทำงานได้กับ pairplot แต่มันเพิ่มข้อยกเว้นกับ 'ชนิด' ของแผนการอื่น หวังว่าในการเผยแพร่ในอนาคตจะมีวิธีการแบบครบวงจรมากขึ้นเพื่อให้ได้วัตถุ 'ร่าง' จากพล็อตทะเล
Salvatore Cosentino
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.