Cách lưu một âm mưu Seaborn vào một tệp


171

Tôi đã thử đoạn mã sau ( 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()

Nhưng tôi nhận được lỗi này:

  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'

Tôi hy vọng trận chung kết output.pngsẽ tồn tại và trông như thế này:

nhập mô tả hình ảnh ở đây

Làm thế nào tôi có thể giải quyết vấn đề?


1
Câu trả lời của @Terry Wang dưới đây có tác dụng với tôi - Python 2.7.12seaborn 0.7.1
Cristian E. Nuno

1
Một lớp lót cho 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

Câu trả lời:


129

Loại bỏ get_figurevà chỉ sử dụngsns_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
Xin lưu ý rằng điều này không hoạt động trong Seaborn 0.7.1 (xem câu trả lời khác).
Guido

31
Lưu ý rằng câu trả lời này mặc dù được chấp nhận đã lỗi thời. Câu trả lời đúng là do Salvatore đưa ra ở đây.
Gabriel

1
Lỗi vào năm 2020:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx

234

Các giải pháp được đề xuất không tương thích với Seaborn 0.8.1

đưa ra các lỗi sau vì giao diện Seaborn đã thay đổi:

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

Các cuộc gọi sau cho phép bạn truy cập vào hình (tương thích Seaborn 0.8.1):

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

như đã thấy trước đây trong câu trả lời này .

CẬP NHẬT: Gần đây tôi đã sử dụng đối tượng PairGrid từ seaborn để tạo ra một cốt truyện tương tự như trong ví dụ này . Trong trường hợp này, vì GridPlot không phải là một đối tượng cốt truyện như, ví dụ, sns.swarmplot, nên nó không có hàm get_figure (). Có thể truy cập trực tiếp vào số liệu matplotlib bằng cách

fig = myGridPlotObject.fig

Giống như đề xuất trước đây trong các bài viết khác trong chủ đề này.


2
Gần đây tôi đã sử dụng đối tượng PairGrid từ seaborn như trong ví dụ
Salvatore Cosentino

2
Đây là câu trả lời duy nhất phù hợp với PairGrid và JointGrid, tôi nghĩ nó nên được chấp nhận.
Ryszard Cetnarski

41

Một số giải pháp trên không hiệu quả với tôi. Các .figthuộc tính không được tìm thấy khi tôi cố gắng đó và tôi đã không thể sử dụng .savefig()trực tiếp. Tuy nhiên, những gì đã làm việc là:

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

Tôi là người dùng Python mới hơn, vì vậy tôi không biết liệu đây có phải là do cập nhật hay không. Tôi muốn đề cập đến nó trong trường hợp bất kỳ ai khác gặp phải vấn đề tương tự như tôi đã làm.


1
Điều này làm việc cho tôi với một seaborn.swarmplot, nhưng cho seaborn.lmplotđiều đó sẽ không làm việc. Với seaborn.lmplot, tôi thấy sns_plot.savefig("output.png")làm việc như trong câu trả lời của Salvatore, nhưng không cần get_figure()gọi.
Wayne

14

Bạn chỉ có thể sử dụng savefigphương pháp sns_plottrực tiếp.

sns_plot.savefig("output.png")

Để rõ ràng với mã của bạn nếu bạn muốn truy cập vào số liệu matplotlib sns_plotcư trú thì bạn có thể lấy nó trực tiếp với

fig = sns_plot.fig

Trong trường hợp này, không có get_figurephương thức nào như mã của bạn giả định.


9

Tôi sử dụng distplotget_figuređể lưu hình ảnh thành công.

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

Làm việc cho môi trường của tôi: chức năng sns.distplot()trong python 3.5.6với seaborn 0.9.0. Bên cạnh đó, chức năng sns.pairplot()không cần dòng củaget_figure()
Scott Yang

9

Ít dòng hơn cho người tìm kiếm 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')

CẬP NHẬT LƯU Ý: sizeđã được thay đổi thành height.


3

Điều này làm việc cho tôi

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

Cũng có thể chỉ cần tạo một figuređối tượng matplotlib và sau đó sử dụng 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

Bạn sẽ gặp lỗi khi sử dụng sns.figure.savefig("output.png")trong seaborn 0.8.1.

Thay vào đó sử dụng:

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

Chỉ cần FYI, lệnh dưới đây hoạt động trong phiên bản 0.8.1 vì vậy tôi đoán câu trả lời ban đầu vẫn còn hiệu lực.

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

Mặc dù mã đó đang hoạt động, nhưng nó không hoàn thành. Tiêu đề cho biết, 'Cách lưu một âm mưu Seaborn vào một tệp' nói chung hơn. Thật không may, giải pháp được đề xuất hoạt động với cặp, nhưng nó làm tăng ngoại lệ với các loại 'lô' khác. Hy vọng trong các phiên bản tương lai sẽ có một cách thống nhất hơn để có được vật thể 'hình' từ một âm mưu dưới đáy biển.
Salvatore Cosentino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.