2012-02-03 72 views
9

Tôi đã vẽ thành công một tập hợp dữ liệu được sắp xếp theo ngày (trục X là ngày tháng) bằng cách sử dụng matplotlib. Tuy nhiên, tôi muốn có thể theo cách thủ công vẽ các đường từ một (ngày1, y1) đến một ngày khác (ngày2, y2) trên biểu đồ được vẽ.đồ thị tương tác matplotlib (vẽ đường thẳng trên biểu đồ)

Tôi dường như không tìm thấy bất kỳ ví dụ nào cho thấy cách thực hiện việc này - hoặc thực sự nếu nó thậm chí còn khả thi.

Nói tóm lại, đây là những gì tôi muốn làm:

  1. Vẽ một tập các dòng trên đồ thị vẽ
  2. Lưu dữ liệu dòng bằng tay rút ra để nộp
  3. tải dòng dữ liệu bằng tay rút ra từ tập tin (để tái tạo biểu đồ)
  4. Lý tưởng nhất, tôi muốn để lưu trữ 'dữ liệu meta' về dòng rút ra (ví dụ như màu sắc, đường rộng vv)

Ai đó có thể đăng đoạn mã (tốt nhất là với liên kết để biết thêm thông tin), để cho biết cách tôi có thể bắt đầu triển khai thực hiện điều này (yêu cầu chính là khả năng vẽ đường kẻ trên biểu đồ và sau đó lưu/tải dòng vào âm mưu).

Lưu ý: Bằng 'thủ công', ý tôi là có thể vẽ các đường bằng cách nhấp vào một điểm và sau đó nhấp vào một điểm khác trong biểu đồ được vẽ. để vẽ một đường giữa hai điểm (hoặc đơn giản là nhấp vào một điểm và cách kéo và thả chuột tại một điểm khác trên đồ thị vẽ)

[[Cập nhật]]

Dawe, cảm ơn rất nhiều cho đoạn mã bạn đã cung cấp. Điều này cho phép tôi làm những gì tôi đang cố gắng làm - tuy nhiên, ngay khi dòng được vẽ trên canvas (sau khi nhấp chuột thứ hai), GUI bị treo và tôi nhận được thông báo cảnh báo này trên bảng điều khiển:

/usr/local/lib/python2.6/dist-packages/matplotlib/backend_bases.py:2192: DeprecationWarning: Using default event loop until function specific to this GUI is implemented 
    warnings.warn(str,DeprecationWarning) 

Bạn có biết điều gì đang gây ra cảnh báo này và chấm dứt chương trình đột ngột không?

Ngoài ra, có thể vẽ nhiều dòng trên biểu đồ không? (Tôi đoán điều này sẽ liên quan đến việc viết một số loại xử lý sự kiện mà sẽ nhanh chóng một biến lót). Tại thời điểm này, tôi có cơ hội để vẽ chỉ một dòng trước khi 'ứng dụng' đột ngột chấm dứt.

+0

"Thủ công" không rõ ràng (và đặt chữ in đậm không giải quyết được sự mơ hồ). Bạn có nghĩa là bằng tay bằng cách nhấp vào một điểm và sau đó trên một điểm khác, hoặc bạn có ý nghĩa bằng tay bằng cách gõ một cái gì đó? Hay là đủ? – DSM

+0

@DSM: làm rõ ý nghĩa của 'thủ công' như được sử dụng trong câu hỏi.HTH –

+0

http://matplotlib.sourceforge.net/api/widgets_api.html có thể là nơi bắt đầu. –

Trả lời

9

Tôi sẽ viết một cái gì đó như thế này:

import matplotlib.pyplot as plt 
class LineDrawer(object): 
    lines = [] 
    def draw_line(self): 
     ax = plt.gca() 
     xy = plt.ginput(2) 

     x = [p[0] for p in xy] 
     y = [p[1] for p in xy] 
     line = plt.plot(x,y) 
     ax.figure.canvas.draw() 

     self.lines.append(line) 

Sử dụng ginput() bạn có thể tránh việc xử lý sự kiện phức tạp hơn. Cách nó 'làm việc' là bạn âm mưu điều gì đó:

plt.plot([1,2,3,4,5]) 
ld = LineDrawer() 
ld.draw_line() # here you click on the plot 

Đối với tiết kiệm/tải dữ liệu dòng vào một tập tin, bạn có thể dễ dàng thực hiện một phương pháp sử dụng pickle hoặc shelve. Bạn cũng có thể chuyển siêu dữ liệu cần thiết theo phương pháp draw_line()

+2

+1 cho mã giúp tôi ở đó (gần như). Đây là ** CHÍNH XÁC ** những gì tôi đang cố gắng làm !. Cảm ơn bạn rất nhiều!. Có một vấn đề nhỏ với đoạn mã hiện tại (ngoài vấn đề không gian tên nhỏ). Khi tôi chạy kịch bản, nó cho phép tôi vẽ trên canvas bằng cách nhấp vào (như tôi muốn) - tuy nhiên, trên lần nhấp chuột thứ hai, khi dòng được vẽ, GUI ngay lập tức gặp sự cố và tôi có cảnh báo trên bảng điều khiển (vui lòng xem câu hỏi được cập nhật của tôi) –

+0

Đảm bảo bạn chạy mã này trong chế độ pylab IPython: 'ipython -pylab'. Điều này thiết lập vòng lặp sự kiện cho backend mà bạn đang sử dụng một cách chính xác làm cho công việc tương tác nhanh và bẩn này. – dawe

Các vấn đề liên quan