Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Tiện ích Matplotlib

Matplotlib không chỉ dành cho các ô tĩnh. Mặc dù GUI thường được tạo bằng các thư viện và khung GUI như PyQt, tkinter, Tuyệt vọngwxPythonvà trong khi Python có tích hợp tuyệt vời với PyQt, Tkinter wxPython – không cần sử dụng bất kỳ thứ nào trong số này cho một số chức năng GUI cơ bản, thông qua Tiện ích Matplotlib.

Sản phẩm matplotlib.widgets mô-đun có một số lớp, bao gồm AxesWidget, trong đó Buttons, CheckButtons, Sliders, TextBoxes, vv được dẫn xuất. Tất cả đều chấp nhận Axes chúng đang được thêm vào làm đối số hàm tạo bắt buộc duy nhất và vị trí của chúng phải được đặt thủ công. Một điều cần lưu ý là widget là các trục, vì vậy bạn sẽ tạo một Axes ví dụ cho mỗi widget.

Một điều cần lưu ý là bạn phải giữ các tham chiếu đến các vật dụng nếu không, họ có thể bị thu gom rác.

Mỗi người trong số họ cũng có thể bị vô hiệu hóa bằng cách cài đặt active đến False, trong trường hợp đó, chúng sẽ không phản hồi với bất kỳ sự kiện nào, chẳng hạn như được nhấp vào. Nói như vậy, chúng tôi có thể giới thiệu một loại tương tác mới cho các ô của mình, thông qua các thành phần và thành phần GUI khác nhau.

Lưu ý: Matplotlib không được sử dụng để tạo GUI chất lượng cao cũng như các hệ thống thân thiện với người dùng. Những vật dụng này còn thô sơ, trông không đẹp lắm và có chức năng hạn chế. Chúng nhằm mục đích tạo nguyên mẫu và thử nghiệm mọi thứ thay vì thực sự vận chuyển chúng.

Nếu bạn đã từng làm việc với PyQt trước đây – bạn có thể nhận thấy rằng cú pháp chung và cách tiếp cận để thêm các tiện ích này cũng như kết nối chúng với trình xử lý sự kiện khá quen thuộc.

Thêm các nút

Hãy bắt đầu với nút - các matplotlib.widgets mô-đun xác định một Button lớp. Để kết nối với nó, chúng tôi gọi on_clicked() hàm thực thi chức năng mà chúng tôi cung cấp. Khi một lần nhấp đã được phát hiện, chức năng sẽ thực thi.

Trong khi tạo nút, chúng tôi chỉ định một Axes với nó, được sử dụng để định vị. Chúng tôi cũng có thể vượt qua trong một label tại thời điểm đó, để thêm một số văn bản và chú thích nó cho người dùng. Các colorhovercolor các đối số xác định màu của nút trước và sau khi nó được di chuột qua.

Vì chúng tôi đảm nhiệm việc định vị và không gian cho tất cả các tiện ích – hãy tạo một FigureAxes, cho phép một số khoảng cách ở phía dưới để thêm nút và vẽ Biểu đồ phân tán trống. Sau đó, chúng ta sẽ xác định một EventHandler lớp, có một phương thức duy nhất add_random(). Phương pháp này tạo ra hai số ngẫu nhiên và vẽ một điểm đánh dấu cho chúng trên Axes chúng tôi đã tạo trước đây và gọi plt.draw(), vẽ lại Figure. Khi cập nhật các ô, chúng ta sẽ luôn phải gọi plt.draw() một lần nữa để thực sự cập nhật nó:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
plot = ax.scatter([], []) class EventHandler: def add_random(self, event): x = np.random.randint(0, 100) y = np.random.randint(0, 100) ax.scatter(x, y) plt.draw() # Axes for the Button and positioning
# xposition and yposition in percentages, width, height
button_ax = plt.axes([0.7, 0.05, 0.2, 0.07])
# Create Button and assign it to `button_ax` with label
button = Button(button_ax, 'Add Random', color='green', hovercolor='red')
# On a detected click, execute add_random()
button.on_clicked(EventHandler().add_random) plt.show()

Điều này dẫn đến một Figure, với một trống rỗng Axes bên trong nó và một nút ở góc trên cùng bên phải của màn hình, Axes:

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Và sau khi nhấn nút vài chục lần, ax sẽ được điền bằng các điểm đánh dấu ngẫu nhiên:

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Nói một cách thực tế hơn, chúng tôi có thể tạo ra một chu kỳ của các tính năng để được vẽ trên mỗi lần nhấn nút. Điều này yêu cầu một vài chỉnh sửa đối với EventHandler, cũng như một nút khác để quay lại chu kỳ đó.

Hãy sử dụng Chất lượng rượu vang đỏ tập dữ liệu một lần nữa và trực quan hóa một số tính năng dựa trên CÓ CỒN tính năng. Vì chúng ta không thể bận tâm đến việc vẽ đồ thị các tính năng này một cách riêng lẻ bằng cách viết mã để vẽ đồ thị này với tính năng kia, sau đó sửa đổi mã đó để vẽ đồ thị của tính năng khác với tính năng kia.

Việc tạo Ma trận phân tán có thể giúp ích cho chúng ta ở đây, nhưng nếu tập dữ liệu có nhiều tính năng thì nó sẽ khá khó đọc và chúng ta sẽ không đi xa được. Nếu bạn muốn có cả hai các ô quy mô lớn mà bạn có thể dễ dàng xem và giải thích, cũng vì có nhiều tính năng được thực hiện mà không cần nỗ lực thêm – bạn có thể tự động hóa quy trình này bằng các nút:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv')
plot = ax.scatter([], []) class EventHandler: i = 0 # Find and plot next feature, re-draw the Axes def next_feature(self, event): # If the counter is at the end of the columns # Revert it back to 0 to cycle through again if self.i >= len(df.columns): self.i = 0 # Clear Axes from last plot ax.cla() # Plot a feature against a feature located on the `i` column ax.scatter(df['alcohol'], df.iloc[:,self.i]) # Set labels ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) # Increment i self.i += 1 # Update Figure plt.draw() def previous_feature(self, event): # If the counter is at the start of the columns # Revert it back to the last column to cycle through if self.i <= 0: self.i = len(df.columns)-1 ax.cla() ax.scatter(df['alcohol'], df.iloc[:,self.i]) ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) self.i -= 1 plt.draw() # Add buttons
button1_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
next_button = Button(button1_ax, 'Next Feature')
next_button.on_clicked(EventHandler().next_feature) button2_ax = plt.axes([0.45, 0.02, 0.2, 0.07])
previous_button = Button(button2_ax, 'Previous Feature')
previous_button.on_clicked(EventHandler().previous_feature) plt.show()

Sản phẩm EventHandler lớp hiện có hai phương thức – next_feature()previous_feature(). Cả hai điều này đều kiểm tra xem bộ đếm i đã đến cuối hoặc đầu danh sách cột – và để tránh IndexError, chúng tôi đặt lại chỉ mục thành giá trị ngược lại và mô phỏng chu kỳ. Đi xuống bên dưới 0 sẽ đưa chúng ta trở lại cuối của danh sách cột và đi lên phía trên cột cuối cùng sẽ đưa chúng ta trở lại cột đầu tiên.

Sau khi xác định được vị trí của chúng tôi – chúng tôi xóa Axes, vì chúng ta sẽ vẽ đồ thị lại trên đồ thị hiện có mà không xóa nó qua cla() (cltai axes). Ngoài ra, bạn cũng có thể tích lũy các mối quan hệ đối tượng địa lý, bằng cách vẽ chồng lên nhau và sử dụng cla() khi đặt lại chỉ mục vào cuối / bắt đầu chu kỳ.

Sau khi xóa Axes – chúng tôi đã có một bức vẽ sạch để vẽ lên bằng ax.scatter() chức năng. Trong ví dụ này, tính năng cố định là CÓ CỒN, vì vậy nó luôn hiện diện. Tính năng khác khác nhau và có thể được truy cập thông qua iloc[], chuyển vào chỉ mục của cột. Điều này trả về một Series mà chúng ta có thể sử dụng trong âm mưu này. Tương tự, chúng ta có thể truy cập tên cột thông qua chỉ mục của họ nữa – df.columns[index], được sử dụng để đặt nhãn trục Y.

Cuối cùng, chúng tôi tăng / giảm bộ đếm và gọi plt.draw() để cập nhật Figure:

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Khi chúng tôi nhấp vào Tính năng tiếp theo , tính năng tiếp theo trong danh sách các cột sẽ được vẽ dựa trên CÓ CỒN, và Figure sẽ được cập nhật một cách thích hợp – nhãn, điểm đánh dấu và tỷ lệ. Ngược lại cũng vậy – Tính năng trước sẽ duyệt qua danh sách theo hướng ngược lại, cho phép chúng tôi quay vòng qua lại, với cơ chế an toàn đặt lại bộ đếm của chúng tôi mỗi khi chúng tôi đến cuối hoặc đầu chu kỳ.

Thêm các nút radio và hộp kiểm

Nút radio được sử dụng để cho phép người dùng chọn một giá trị ra khỏi một số giá trị. Mỗi lần chỉ có thể chọn một nút radio và chúng thường đại diện cho một lựa chọn. Hộp kiểm tra có thể được sử dụng nếu bạn muốn cho phép người dùng chọn nhiều tùy chọn cùng một lúc.

Lưu ý: Rất hạn chế khả năng kiểm tra xem hộp kiểm có on or off. Trong thực tế, không có gì ngoài hộp. Bạn chỉ có thể kiểm tra xem hộp có ép lại or không, điều này đặt ra một hạn chế nghiêm trọng về cách nó có thể được sử dụng vì chúng tôi không biết nó ở trạng thái nào trước đó. Cách thay thế duy nhất là giữ bộ đếm / kiểm tra của riêng bạn như trạng thái hiện tại của hộp bằng boolean và thay đổi logic dựa trên đó.

Điều này sẽ cho phép bạn, ví dụ, thêm một hộp kiểm cho mỗi đối số tùy chỉnh của một cốt truyện nhất định, cho phép người dùng đặt chúng True or False (được chọn hoặc bỏ chọn), hoặc bất kỳ ánh xạ không xung đột nào khác dựa trên các trạng thái này.

Tuy nhiên, do API bị giới hạn nên chúng tôi cũng sẽ giới hạn mục đích sử dụng dự kiến ​​– bật và tắt mọi thứ. Chúng ta sẽ có hai tính năng mà chúng ta có thể biến onoff thông qua Hộp kiểm. Lưu ý rằng ngay cả chức năng này cũng bị giới hạn ở các đối tượng mà bạn có thể kiểm tra xem chúng có hiển thị hay không.

Mặt khác, chúng tôi không muốn cho phép người dùng áp dụng hai thang đo cùng một lúc hoặc đặt hai giới hạn X cùng một lúc, vì chỉ câu lệnh có tên thứ hai trong chuỗi mới được áp dụng. Đối với những điều này – chúng tôi sẽ sử dụng Nút Radio.

Hãy thêm một vài Nút radio để cho phép người dùng chọn phạm vi trục thông qua một vài Nút radio, nhưng cũng cho phép họ hiển thị trực quan hóa tính năng onoff:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons
from matplotlib.widgets import RadioButtons fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') # Plot two line plots for two features, and turn them invisible
line1, = ax.plot(df['fixed acidity'], visible=False)
line2, = ax.plot(df['citric acid'], visible=False) class EventHandler: # set_range handler def set_range(label): if (label == 'Small Range'): ax.set_xlim(0, 1600) ax.set_ylim(0, 25) else: ax.set_xlim(0, 1600) ax.set_ylim(0, 50) plt.draw() # Turn off, if on, and on if off def apply_features(label): if (label == 'Fixed Acidity'): line1.set_visible(not line1.get_visible()) elif (label == 'Citric Acid'): line2.set_visible(not line2.get_visible()) plt.draw() # Add radio buttons and checkboxes
ranges_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
range_radio_buttons = RadioButtons(ranges_ax, ('Small Range', 'Large Range'))
range_radio_buttons.on_clicked(EventHandler.set_range) checkboxes_ax = plt.axes([0.4, 0.02, 0.25, 0.1])
checkboxes = CheckButtons(checkboxes_ax, ('Fixed Acidity', 'Citric Acid'))
checkboxes.on_clicked(EventHandler.apply_features) plt.show()

Một lần nữa, chúng ta có hai phương pháp trong EventHandler() lớp - set_range()apply_features(). Các set_range() phương pháp này đặt phạm vi thành “nhỏ” hoặc “lớn”, bằng cách điều chỉnh Axes' Giới hạn X và Y. Các apply_features() chức năng thay đổi visible trường của Lô đường dây mà chúng tôi đã thực hiện trước đó, dựa trên hiện tại của chúng visible trạng thái. Nếu visible == True, chúng tôi tắt Biểu đồ đường và ngược lại.

Chúng tôi phải dựa vào khả năng tích hợp sẵn để kiểm tra mức độ hiển thị của Sơ đồ đường vì chúng tôi không thể kiểm tra xem hộp kiểm đã được chọn hay chưa trước đó. Khả năng tương tự này có thể được mô phỏng bằng một status boolean trong phạm vi của EventHandler() lớp, được đặt thành TrueFalse trên mỗi cú nhấp chuột, đối với các loại biểu đồ không hỗ trợ kiểm tra xem chúng có hiển thị ngay lập tức hay không.

Chạy mã này dẫn đến kết quả là Figure với hai bộ nút ở dưới cùng. Nếu chúng tôi chọn cả hai hộp kiểm, cả hai Đường thẳng sẽ xuất hiện:

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Chúng tôi có thể tắt chúng riêng lẻ:

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Và chúng tôi có thể thay đổi phạm vi của Axes qua các Nút Radio:

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Thêm hộp văn bản

Hộp văn bản đã quen với thu thập dữ liệu từ người dùng - và chúng tôi có thể thay đổi sơ đồ dựa trên dữ liệu này. Ví dụ: chúng ta có thể yêu cầu người dùng nhập tên của một tính năng hoặc chèn một hàm để biểu đồ của chúng ta trực quan hóa. Tất nhiên, làm việc với thông tin đầu vào của người dùng có thể khó khăn – luôn có những trường hợp khó khăn cần lưu ý.

Hãy viết một đoạn script cho phép người dùng nhập một tên tính năng của một tập dữ liệu và Axes cập nhật trên mỗi lần gửi để phản ánh đầu vào. Để thuận tiện cho người dùng, chúng tôi sẽ cho họ biết nếu dữ liệu đầu vào không khớp với tên cột:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import TextBox fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') class EventHandler: def submit(feature_name): if feature_name != "" or feature_name != None: if feature_name in df: ax.cla() ax.plot(df[feature_name]) else: if len(textbox_ax.texts) > 2: del textbox_ax.texts[-1] textbox_ax.text(-2, 0.4, feature_name + ' was not found.') plt.draw() textbox_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
textbox = TextBox(textbox_ax, 'Feature Name')
textbox.on_submit(EventHandler.submit) plt.show()

Chúng tôi có một kiểm tra đơn giản để xem nếu cung cấp feature_name trống hoặc None, trong trường hợp đó, chúng tôi không làm gì cả. Nếu không, chúng tôi sẽ kiểm tra xem feature_name có mặt trong DataFrame, đính kèm thông báo rằng tính năng này không được tìm thấy nếu nó không hiện diện. Tuy nhiên, trước khi đính kèm văn bản, chúng ta phải đảm bảo rằng tin nhắn trước đó đã bị xóa để tin nhắn mới không trùng với nó. Các axes.texts tài sản là một danh sách của tất cả Text các trường hợp trên một Axes. Kể từ khi Axes đã có một Text ví dụ, thuộc về của chúng tôi TextBox, chúng tôi không muốn xóa bất cứ thứ gì nếu có 2 hoặc ít hơn Text trường hợp hiện diện – thông báo lỗi và TextBox nhãn.

Nếu ở trên hai, chúng tôi đã nhận được thông báo lỗi, cần xóa thông báo này.

Nếu tính năng is có mặt trong DataFrame, tuy nhiên, chúng tôi xóa Axes và vẽ nó:

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Thêm bộ chọn khoảng cách

Bộ chọn khoảng cách có thể được sử dụng để cho phép người dùng chọn một khoảng dữ liệu và tập trung vào nó, đặt giới hạn trục dựa trên lựa chọn đó. Theo mặc định, nhiều thư viện hỗ trợ chức năng này, tuy nhiên thật không may, Matplotlib lại không hỗ trợ và chúng ta sẽ phải thực hiện việc này một cách thủ công. Ngoài ra, chúng ta sẽ phải bổ sung thêm "Cài lại" nút nếu chúng ta muốn thu nhỏ là tốt.

Để thêm một Bộ chọn nhịp, chúng ta không cần phải dành toàn bộ mới Axes đối với nó – chúng ta có thể gắn nó vào một cái hiện có, điều này rất có ý nghĩa. Khi tạo ra một SpanSelector, chúng tôi cung cấp Axes nó thuộc về, cũng như trình xử lý sự kiện, theo sau là 'horizontal' or 'vertical', xoay AxesSpan Selector cả hai.

Sản phẩm useblit đối số thường được đặt thành True bởi vì nó nâng cao hiệu suất trên hầu hết các chương trình phụ trợ. Ngoài ra, chúng tôi đã thêm một số thuộc tính tạo kiểu, chẳng hạn như cài đặt alpha của hình chữ nhật được tạo dưới dạng Bộ chọn khoảng cách để 0.5facecolor tốt đẹp tab:blue:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('AmesHousing.csv') ax.scatter(x = df['Year Built'], y = df['Total Bsmt SF'], alpha = 0.6) class EventHandler: def select_horizontal(x, y): ax.set_xlim(x, y) plt.draw() def reset(self): ax.set_xlim(df['Year Built'].min(), df['Year Built'].max()) plt.draw span_horizontal = SpanSelector(ax, EventHandler.select_horizontal, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='tab:blue')) button_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
button = Button(button_ax, 'Reset')
button.on_clicked(EventHandler.reset) plt.show()

Chạy thao tác này sẽ tạo ra một biểu đồ mà trên đó chúng ta có thể chọn các nhịp và phóng to chúng bằng cách đặt giới hạn Trục thành các giá trị được cung cấp:

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Thêm thanh trượt

Thanh trượt cho phép người dùng chọn giữa nhiều giá trị một cách trực quan bằng cách trượt một điểm đánh dấu và chọn một giá trị. Thông thường, các thanh trượt được sử dụng để liên tục cập nhật một số giá trị trên một biểu đồ, chẳng hạn như phạm vi của nó or thậm chí là một tính năng. Ví dụ: bạn có thể điều chỉnh giá trị của một hằng số thông qua một thanh trượt, điều này sẽ ảnh hưởng đến một hàm dựa vào hằng số đó.

Hãy viết một tập lệnh cho phép chúng ta thay đổi giới hạn trục Y và X, thông qua một thanh trượt, cho phép chúng ta thay đổi góc nhìn mà chúng ta đang xem dữ liệu của mình:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2, left=0.2) df = pd.read_csv('winequality-red.csv')
plot, = ax.plot(df['volatile acidity']) class EventHandler: def update(val): ax.set_ylim(0, yslider.val) ax.set_xlim(0, xslider.val) plt.draw() xslider_ax = plt.axes([0.35, 0.03, 0.5, 0.07])
xslider = Slider( ax=xslider_ax, label="X-limit", valmin=0, valmax=len(df['volatile acidity']), valinit=len(df['volatile acidity']), orientation="horizontal"
) yslider_ax = plt.axes([0.03, 0.2, 0.07, 0.5])
yslider = Slider( ax=yslider_ax, label="Y-limit", valmin=0, valmax=3, valinit=1.5, orientation="vertical"
) xslider.on_changed(EventHandler.update)
yslider.on_changed(EventHandler.update) plt.show()

Chúng tôi đã điều chỉnh phần đệm để cho phép thanh trượt ở bên trái và dưới cùng của Axesvà vẽ một Biểu đồ Đường đơn giản. Việc thêm một thanh trượt yêu cầu chúng tôi thực hiện một Axes cho nó, giống như với hầu hết các tiện ích con khác và gán nó cho ax đối số của Slider thông qua hàm tạo. Ngoài ra, chúng ta có thể đặt giá trị tối thiểu, tối đa và ban đầu của thanh trượt. Đây thường là các phạm vi động, dựa trên dữ liệu bạn đang vẽ nhưng cũng có thể được đặt giá trị vô hướng theo cách thủ công.

Ngoài ra, thẻ cào Sliders có thể được định hướng theo chiều ngang hoặc chiều dọc. Vì chúng có nghĩa là được cập nhật liên tục thông qua thao tác vuốt chuột – on_changed() chức năng được sử dụng để kích hoạt phản hồi khi người dùng đưa ra đầu vào. Chúng tôi đã điều chỉnh EventHandler lớp học với một update() chức năng chỉ điều chỉnh các giá trị của giới hạn X và Y dựa trên value của các thanh trượt tương ứng.

Chạy mã này sẽ tạo ra một âm mưu có hai thanh trượt, chúng tôi có thể sử dụng để thay đổi phạm vi của Axes:

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Các tiện ích Matplotlib Thông minh dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Dấu thời gian:

Thêm từ xếp chồng lên nhau