2015-01-02 14 views
19

Tôi đang sử dụng một cái gì đó đơn giản hơn so với các mẫu mã trên pyplot tutorial website:Python Matplotlib Cairo lỗi

import matplotlib.pyplot as plt 
plt.plot([1,2,3,4,5]) 
plt.show() 

nhưng khi tôi chạy nó, tôi nhận được lỗi:

TypeError: Couldn't find foreign struct converter for 'cairo.Context'

tôi 'm trên Python 3.4.2, và có một cài đặt mới của matplotlib, cairocfft> 0,6, numpy> = 1,6 từ pip.

Tôi đã cố gắng gỡ bỏ cài đặt cairocfft và grabbing từ các kho Arch, nhưng bây giờ tôi có lỗi:

NotImplementedError: Surface.create_for_data: Not Implemented yet.

Có cách nào để vẽ một đồ thị dòng cơ bản mà không cần cài nhiều thư viện? Tôi không nhiệt tình với số điện thoại installing pyqt4, như đề xuất this blogpost. This github issue gợi ý cài đặt gi-cairo, nhưng gi-cairo không nằm trên Arch repositories, cũng không phải tôi có thể tìm thấy nó trên PyPI (tìm kiếm của riêng tôi thất bại?)

Tôi nhớ này là một làn gió trên python2, nhưng đã di cư đến Python3 nay .

+0

Làm việc tốt cho tôi trên Arch. Tôi đã có python 3.4.2 và python-cairo 1.10.0-4. – matsjoyce

+0

Bạn đã cài đặt 'python-gobject' chưa? – nwk

+0

@nwk yes, 'python-gobject' được cài đặt. – JDong

Trả lời

29

Đây là trường hợp ai đó gặp sự cố tương tự trên Ubuntu 14.04, như tôi đã sử dụng Python 3.4.3. Bằng cách sử dụng bit và gợi ý từ câu trả lời của JDong, tôi đã giải quyết vấn đề như sau. (Về cơ bản, thay đổi phần phụ trợ MatPlotLib thành qt5agg.)

  1. Cài đặt python3-pyqt5. sudo apt-get install python3-pyqt5

  2. Tìm hiểu nơi tệp matplotlibrc là để bạn có thể chỉnh sửa. Điều này có thể được thực hiện bằng cách sử dụng sau đây trong bảng điều khiển Python. import matplotlib matplotlib.matplotlib_fname()

  3. Chỉnh sửa các tập tin matplotlibrc (có thể bạn sẽ yêu cầu sudo), tìm dòng bắt đầu bằng backend :, và thay đổi nó để backend : qt5agg. Nếu một dòng như vậy không tồn tại, chỉ cần tạo một dòng.

Các bước trên đã giải quyết cho tôi trên Ubuntu 14.04. Tôi hy vọng rằng sẽ giúp.

+0

Xác nhận làm việc trong Ubuntu 14.04 với Python 3.4 - FWIW tệp có vẻ như được cài đặt trong '/ usr/local/lib/python3.4/dist-packages/matplotlib/mpl-data/matplotlibrc' và sẽ giống nhau đối với mọi người (mặc dù phương thức được đề xuất bởi @Ray hoạt động tốt). – Marco

6

Điều này dường như là một vấn đề thực sự; khi tiếp tục chơi, tôi đã tìm thấy thông báo lỗi:

/usr/lib/python3.4/site-packages/matplotlib/backends/backend_gtk3agg.py:18: 
UserWarning: The Gtk3Agg backend is known to not work on Python 3.x with pycairo. 
Try installing cairocffi. 
"The Gtk3Agg backend is known to not work on Python 3.x with pycairo." 

Rất tiếc, tôi đã cài đặt cairocffi. Giải pháp tốt nhất mà tôi tìm thấy là sử dụng một chương trình phụ trợ khác, như tcaswell được đề xuất trong các nhận xét. Tôi tìm thấy xuất khẩu sang pdf rất dễ chịu chỉ với dòng: plt.savefig("Graph.pdf").

skytux đề cập rằng việc thay đổi chương trình phụ trợ cho Tk hoạt động. https://stackoverflow.com/a/21791045/2534876 cho biết cách thực hiện việc này.

Cập nhật tháng 3 năm 2016: plotly là giải pháp thay thế tuyệt vời cho matplotlib mà tôi hiện sử dụng. Nó hoạt động với trình duyệt để tạo tài liệu và tôi chưa gặp sự cố nền tảng.

2

Trong trường hợp của Python 2.7 nó có thể được giải quyết bằng cách cài đặt gói python-pyqt5 và sử dụng pyplot như thế này:

import matplotlib 
matplotlib.use('Qt5Agg') 
import matplotlib.pyplot as plt 

Nếu bạn có sudo acces bạn cũng có thể thiết lập Qt5Agg như backend mặc định của bạn, xem Matplotlib Backend cách khác để thiết lập phụ trợ của bạn.

3

Khi cài đặt Matplotlib cảnh báo tôi cài đặt cairocffi, vì không tương thích trong hệ thống của tôi. Sau khi trải qua NotImplementedError (các ô không được vẽ), việc cài đặt gói python3-cairocffi của Debian đã giải quyết được sự cố.

+0

Điều này sẽ được bỏ phiếu. Giải pháp tốt hơn nhiều so với việc thay đổi backend thành Qt. –

2

Cài đặt python-gi-cairo sử dụng sudo apt-get install python-gi-cairo giải quyết được sự cố của tôi

+0

Trong trường hợp của tôi (Debian 9.2), câu trả lời được chấp nhận đã không giúp ích gì nhưng điều này đã làm! – phinz