พล็อตเรื่องทะเลไม่แสดง


205

ฉันแน่ใจว่าฉันลืมสิ่งที่ง่ายมาก แต่ฉันไม่สามารถรับแผนการบางอย่างที่ทำงานกับ Seaborn ได้

ถ้าฉันทำ:

import seaborn as sns

จากนั้นแปลงใด ๆ ที่ฉันสร้างขึ้นตามปกติด้วย matplotlib จะได้รับการจัดแต่งทรงผมในทะเล (ด้วยตารางสีเทาในพื้นหลัง)

อย่างไรก็ตามหากฉันพยายามทำหนึ่งในตัวอย่างเช่น:

In [1]: import seaborn as sns

In [2]: sns.set()

In [3]: df = sns.load_dataset('iris')

In [4]: sns.pairplot(df, hue='species', size=2.5)
Out[4]: <seaborn.axisgrid.PairGrid at 0x3e59150>

ฟังก์ชั่น pairplot ส่งคืนวัตถุ PairGrid แต่พล็อตไม่ปรากฏขึ้น

ฉันสับสนเล็กน้อยเพราะ matplotlib ดูเหมือนว่าจะทำงานได้อย่างถูกต้องและรูปแบบ Seaborn นำไปใช้กับแผนการของ matplotlib อื่น ๆ แต่ฟังก์ชั่น Seaborn ดูเหมือนจะไม่ทำอะไรเลย ใครบ้างมีความคิดว่าอาจเป็นปัญหาหรือไม่


12
เพียงเดาด่วน ... หากคุณใช้ ipython คุณต้องโทร%matplotlib inlineเพื่อระบุแบ็กเอนด์แบบอินไลน์ มิฉะนั้นคุณสามารถโทรsns.plt.show()เพื่อแสดงผลพล็อตลงในหน้าต่างแยก
จา

คำตอบ:


360

พล็อตที่สร้างโดยใช้ทะเลจะต้องแสดงเช่นพล็อต matplotlib ธรรมดา ซึ่งสามารถทำได้โดยใช้

plt.show()

ฟังก์ชั่นจาก matplotlib

แต่เดิมฉันโพสต์วิธีแก้ปัญหาเพื่อใช้วัตถุ matplotlib ที่นำเข้าแล้วจาก seaborn ( sns.plt.show()) แต่นี่ถือว่าเป็นการปฏิบัติที่ไม่ดี ดังนั้นเพียงแค่นำเข้าโมดูลmatplotlib.pyplotโดยตรงและแสดงแผนการของคุณด้วย

import matplotlib.pyplot as plt
plt.show()

หากมีการใช้โน้ตบุ๊ก IPython แบ็กเอนด์แบบอินไลน์สามารถเรียกใช้เพื่อลบความจำเป็นในการเรียกการแสดงหลังจากแต่ละพล็อต เวทมนตร์ที่เกี่ยวข้องคือ

%matplotlib inline

4
ฉันยังไม่ได้รับพล็อต sns ที่แสดงการโต้ตอบ sns.plt.show () ไม่ทำงาน แต่เมื่อฉันเปลี่ยนเป็นอินไลน์ฉันจะได้พล็อต (แต่ไม่โต้ตอบ) มีความคิดอะไรบ้าง
ผู้ใช้ 3317704

คุณอาจจะลองระบุ a แบ็กเอนด์ใช้สิ่งที่ต้องการ%matplotlib qt, %matplotlib gtk, %matplotlib tkฯลฯ see %matplotlib?เพื่อดูข้อมูลเพิ่มเติม
Jakob

17
มันน่ารำคาญจริงๆที่ในตัวอย่างที่หน้าท้องทะเลไม่มีคำสั่ง sns.plt.show () พวกเขาจะลืมสิ่งที่ประถมศึกษานี้ได้อย่างไร
Michael Hecht

@MichaelHecht การขาด plt.show () ได้รับการจัดการอย่างใดในเรื่องนี้คุณอาจร้องเรียนของคุณที่นั่น บางทีพวกเขาจะเพิ่มลงในเอกสาร
Jakob

@Jakob มีวิธีการภายใน Jupyter (ผ่าน Anaconda) เพื่อเพิ่มความมหัศจรรย์นี้%matplotlib inlineให้กับไฟล์การกำหนดค่าจำนวนหนึ่งดังนั้นมันจะถูกนำไปใช้เสมอหรือไม่? หรือฉันต้องเพิ่มไปยังสมุดงานใหม่ทุกครั้งหรือไม่
ทำไม

41

ฉันมาที่คำถามนี้ค่อนข้างสม่ำเสมอและใช้เวลาซักครู่เพื่อค้นหาสิ่งที่ฉันค้นหา:

import seaborn as sns
import matplotlib.pyplot as plt

plt.show()  # <--- This is what you are looking for

โปรดทราบ: ใน Python 2 คุณสามารถใช้งานsns.plt.show()ได้ แต่ไม่ใช่ใน Python 3

ตัวอย่างที่สมบูรณ์

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Visualize C_0.99 for all languages except the 10 with most characters."""

import seaborn as sns
import matplotlib.pyplot as plt

l = [41, 44, 46, 46, 47, 47, 48, 48, 49, 51, 52, 53, 53, 53, 53, 55, 55, 55,
     55, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58,
     58, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 61,
     61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62,
     62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 65,
     65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66,
     67, 67, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 69, 69, 69, 70, 70,
     70, 70, 71, 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73,
     74, 74, 74, 74, 74, 75, 75, 75, 76, 77, 77, 78, 78, 79, 79, 79, 79, 80,
     80, 80, 80, 81, 81, 81, 81, 83, 84, 84, 85, 86, 86, 86, 86, 87, 87, 87,
     87, 87, 88, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 92,
     92, 93, 93, 93, 94, 95, 95, 96, 98, 98, 99, 100, 102, 104, 105, 107, 108,
     109, 110, 110, 113, 113, 115, 116, 118, 119, 121]

sns.distplot(l, kde=True, rug=False)

plt.show()

จะช่วยให้

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


1
AttributeError: module 'seaborn' has no attribute 'plt'
weberc2

@ weberc2 แก้ไขแล้ว ปัญหาเกิดขึ้นเฉพาะใน Python 3 ซึ่งไม่มีsns.plt
Martin Thoma

19

เพื่อหลีกเลี่ยงความสับสน (ตามที่ดูเหมือนจะมีบางอย่างในความคิดเห็น) สมมติว่าคุณอยู่ใน Jupyter:

%matplotlib inline> แสดงพล็อตภายในสมุดบันทึก

sns.plt.show()> แสดงพล็อตด้านนอกของโน้ตบุ๊ก

%matplotlib inlineจะแทนที่ sns.plt.show()ในแง่ที่ว่าแปลงจะแสดงในโน้ตบุ๊คแม้ในขณะที่sns.plt.show()เรียกว่า

และใช่มันเป็นเรื่องง่ายที่จะรวมสายเข้ากับ config ของคุณ

เรียกใช้% matplotlib แบบอินไลน์ในโน๊ตบุ๊ค IPython โดยอัตโนมัติ

แต่ดูเหมือนว่าการประชุมที่ดีกว่าเพื่อให้มันพร้อมกับการนำเข้าในรหัสจริง


สำหรับโน้ตบุ๊คจุดประกาย?
technazi

8

สิ่งนี้ใช้ได้สำหรับฉัน

import matplotlib.pyplot as plt
import seaborn as sns
.
.
.
plt.show(sns)

4

คำแนะนำของฉันคือให้

plt.figure()และให้พล็อต SNS ตัวอย่างเช่น

sns.distplot(data).

แม้ว่ามันจะดูเหมือนไม่แสดงพล็อตใด ๆ แต่เมื่อคุณเพิ่มขนาดให้ใหญ่สุดคุณจะสามารถเห็นพล็อตได้


ฉันลืมที่จะสร้างรูป ( plt.figure()) ก่อนที่จะสร้าง lineline ของฉันและไม่เข้าใจว่าทำไมพล็อตไม่แสดง ยอดเยี่ยมขอบคุณ!
Sander Vanden Hautte

2

หากคุณพล็อตในคอนโซล IPython (ที่คุณไม่สามารถใช้งานได้%matplotlib inline) แทนโน้ตบุ๊ก Jupyter และไม่ต้องการที่จะทำงานplt.show()ซ้ำ ๆ คุณสามารถเริ่มคอนโซล IPython ได้ด้วยipython --pylab:

$ ipython --pylab     
Python 3.6.6 |Anaconda custom (64-bit)| (default, Jun 28 2018, 17:14:51) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.
Using matplotlib backend: Qt5Agg

In [1]: import seaborn as sns

In [2]: tips = sns.load_dataset("tips")

In [3]: sns.relplot(x="total_bill", y="tip", data=tips) # you can see the plot now

1

เพื่อบอกจากสไตล์ของข้อมูลโค้ดของคุณฉันคิดว่าคุณกำลังใช้ IPython มากกว่า Jupyter Notebook

ในปัญหานี้บน GitHub มันถูกทำให้ชัดเจนโดยสมาชิกของ IPython ในปี 2559 ที่การแสดงของแผนภูมิจะทำงานเฉพาะเมื่อ "ทำงานได้เมื่อเป็นเคอร์เนล Jupyter" เท่านั้น ดังนั้น %matplotlib inlineจะไม่ทำงาน

ฉันเพิ่งพบปัญหาเดียวกันและแนะนำให้คุณใช้ Jupyter Notebook เพื่อการสร้างภาพข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.