โค้ดตัวอย่าง matplotlib ไม่ทำงานในสภาพแวดล้อมเสมือนของ python

ฉันกำลังพยายามแสดงพิกัด xyz ของรูปภาพใน matplotlib โค้ดตัวอย่างทำงานได้ดีอย่างสมบูรณ์แบบกับการติดตั้ง Python ทั่วโลก: ขณะที่ฉันเลื่อนเคอร์เซอร์ ค่า x,y,z รับการอัปเดตทันที อย่างไรก็ตาม เมื่อฉันรันโค้ดตัวอย่างในสภาพแวดล้อมเสมือนของ Python ฉันจะคลิกที่รูปภาพหลายครั้งเพื่อให้พิกัดแสดงตั้งแต่แรก จากนั้นเมื่อฉันคลิกที่ตำแหน่งอื่น รูปภาพจะอัปเดตบางส่วน หลังจากคลิกไม่กี่ครั้ง พิกัดจะไม่อัปเดตอีกต่อไป

ฉันไม่รู้วิธีแก้ไขข้อบกพร่องนี้


person MAS    schedule 13.10.2015    source แหล่งที่มา
comment
หากโค้ดเหมือนกัน ก็ควรมีความแตกต่างในแพ็คเกจหรือเวอร์ชัน Python ใช้ pip freeze ทั้งในส่วนกลางและในสภาพแวดล้อมเสมือน แล้วเปรียบเทียบ ดูด้วยว่าเวอร์ชั่นของ python นั้นเหมือนกันหรือไม่ อาจเป็นไปได้ว่า matplotlib ใช้แบ็กเอนด์ที่แตกต่างกัน ดังนั้นให้ตรวจสอบ matplotlib.get_backend() ด้วย   -  person swenzel    schedule 13.10.2015
comment
เวอร์ชันหลามก็เหมือนกัน matplotlib นั้นแตกต่างออกไป ฉันถอนการติดตั้งจาก virtualenv และติดตั้งเวอร์ชันเดียวกันที่พบใน global python ของฉัน อย่างไรก็ตาม ปัญหายังคงมีอยู่ @สเวนเซล   -  person MAS    schedule 13.10.2015
comment
แล้วแบ็คเอนด์ล่ะ?   -  person swenzel    schedule 13.10.2015
comment
ฉันได้รับ MacOSX สำหรับทั้ง @swenzel   -  person MAS    schedule 14.10.2015
comment
ลิงค์ด้านล่างดูเหมือนจะมีปัญหาคล้ายกันและอธิบายปัญหาได้ดีขึ้น อย่างไรก็ตาม มันไม่มีคำตอบ stackoverflow.com /คำถาม/29754360/   -  person MAS    schedule 14.10.2015
comment
สิ่งที่เป็นไปได้ที่จะลองคือใช้แบ็กเอนด์ทางเลือก matplotlib.org/faq /usage_faq.html#what-is-a-backend สำหรับ matplotlib (เช่น ใช้ qt4 แทน 'macosx')   -  person J Richard Snape    schedule 15.10.2015
comment
ขอบคุณมาก. วิธีนี้ช่วยแก้ปัญหาได้ @เจอาร์ริชาร์ดสเนป   -  person MAS    schedule 16.10.2015
comment
@MAS ยอดเยี่ยม - ฉันได้เพิ่มมันเป็นคำตอบเพื่อให้คุณสามารถยอมรับและฝากข้อมูลไว้ที่นี่สำหรับผู้เยี่ยมชมในอนาคต   -  person J Richard Snape    schedule 17.10.2015


คำตอบ (4)


นี่อาจเป็นปัญหากับแบ็กเอนด์ macosx สำหรับ matplotlib สลับไปใช้แบ็กเอนด์สำรองสำหรับ matplotlib (เช่น ใช้ qt4 แทน 'macosx') สำหรับรายละเอียดวิธีการสลับแบ็กเอนด์และความหมายที่แท้จริง โปรดดูเอกสารที่นี่ โปรดทราบว่าคุณอาจต้องติดตั้งแบ็กเอนด์ก่อน เช่น pyqt เพื่อใช้แบ็กเอนด์ qt4agg ตามที่ฉันแนะนำที่นี่

โดยสรุป - แบ็กเอนด์เกี่ยวข้องกับเอาต์พุตจาก matplotlib และ matplotlib สามารถกำหนดเป้าหมายรูปแบบเอาต์พุตที่แตกต่างกันได้ สิ่งเหล่านี้อาจเป็นรูปแบบเอาต์พุตการแสดงผล gui (เช่น wx, qt4 เป็นต้น) หรือเอาต์พุตไฟล์ (เช่น pdf) สิ่งเหล่านี้เรียกว่าแบ็กเอนด์แบบโต้ตอบและแบบไม่โต้ตอบตามลำดับ

หากต้องการเปลี่ยนแบ็กเอนด์ให้ทำ

import matplotlib
matplotlib.use('qt4agg')

ในโค้ด หรือ - หากคุณต้องการเปลี่ยนแปลงทุกครั้งที่คุณเริ่ม matplotlib - แก้ไขไฟล์ matplotlibrc ของคุณ คุณลักษณะแบ็กเอนด์เช่น

backend: Qt4Agg

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

person J Richard Snape    schedule 16.10.2015
comment
ทำงานให้ฉัน (หลังจากติดตั้ง pyqt พร้อมชง)! เอกสารประกอบของ matplotlib แนะนำวิธีแก้ปัญหาที่ยาวกว่ามาก ซึ่งฉันไม่สามารถทำได้ในทางปฏิบัติจริง ๆ .. matplotlib.org/faq/ virtualenv_faq.html - person SeF; 06.02.2016

ในที่สุดสิ่งที่ได้ผลสำหรับฉันคือการสร้างไฟล์ matplotlibrc ในเครื่องที่มีคำสั่ง: backend: TkAgg

# Within working directory where running python
vim matplotlibrc
# new file via vim, Nano, whatever
backend: TkAgg

สิ่งนี้มีประโยชน์:

import matplotlib
print matplotlib.rcParams['backend']

หมายเหตุอื่นๆ:

ฉันยังได้ติดตั้ง pyqt โดยใช้ Homebrew (brew install pyqt) และคัดลอก (สามารถย้ายมันได้) ไปที่ $MyVirtEnv/lib/python2.7/site-packages/ จาก /usr/local/lib/python2.7/site-packages/PyQt4

แต่เมื่อฉัน

import matplotlib
matplotlib.use('qt4Agg')
import librosa
 "Matplotlib qt-based backends require an external PyQt4, PyQt5,\n"
ImportError: Matplotlib qt-based backends require an external PyQt4,   PyQt5,
or PySide package to be installed, but it was not found.

ยังได้พยายาม

pip install pyside
Successfully installed pyside-1.2.4

ข้อผิดพลาดเดียวกัน

>>> import pyside
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pyside

ได้รับข้อผิดพลาดต่อไปนี้ในบางจุดเมื่อพยายามนำเข้า matplotlib อีกครั้ง (ฉันคิดว่า)

from . import cache
ImportError: cannot import name cache
person MikeiLL    schedule 15.10.2016

ตามที่ระบุไว้ใน คำถามที่พบบ่อยเกี่ยวกับ Matplotlib virtualenv vext เป็นวิธีแก้ปัญหาที่นี่

อนุญาตให้ใช้ pyqt5 ทั้งระบบได้

นี่เป็นสิ่งจำเป็นจนกว่าการตั้งค่า PyQt5 จะรู้เกี่ยวกับ virtualenvs:

pip3 install vext.pyqt5
person ederag    schedule 09.08.2019

เพียงเพิ่ม plt.show() ต่อท้ายและปัญหาก็ได้รับการแก้ไขสำหรับฉัน

person Man    schedule 20.08.2019
comment
นี่เป็นคำตอบที่ใช้รหัสเท่านั้น คุณต้องการช่วยต่อสู้กับความเข้าใจผิดที่ว่า StackOverflow เป็นบริการเขียนโค้ดฟรีโดยเพิ่มคำอธิบายหรือไม่ - person Yunnosch; 20.08.2019