Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

Matplotlib 위젯

Matplotlib는 정적 플롯만을 위한 것이 아닙니다. GUI는 일반적으로 다음과 같은 GUI 라이브러리 및 프레임워크로 생성됩니다. 파이큐트, 티킨터, 키비wx파이썬, 그리고 Python은 PyQt와 뛰어난 통합을 가지고 있지만 Tkinter는 wxPython – 다음을 통해 일부 기본 GUI 기능에 사용할 필요가 없습니다. Matplotlib 위젯.

XNUMXD덴탈의 matplotlib.widgets 모듈에는 다음을 포함한 여러 클래스가 있습니다. AxesWidget, 그중 Buttons, CheckButtons, Sliders, TextBoxes 등이 파생됩니다. 이들은 모두 받아들인다. Axes 그것들은 유일한 필수 생성자 인수로 추가되고 있으며 위치를 수동으로 설정해야 합니다. 주의할 점은 위젯은 축입니다, 그래서 당신은 Axes 각 위젯에 대한 인스턴스.

주목해야 할 또 다른 점은 위젯에 대한 참조를 유지해야 합니다. 그렇지 않으면 가비지 수집을 받을 수 있습니다.

각각을 설정하여 비활성화할 수도 있습니다. activeFalse, 이 경우 클릭과 같은 이벤트에 응답하지 않습니다. 즉, 다양한 GUI 요소와 구성 요소를 통해 플롯에 새로운 유형의 상호 작용을 도입할 수 있습니다.

참고 : Matplotlib는 고품질 GUI 생성이나 사용자 친화적인 시스템에 사용하기 위한 것이 아닙니다. 이러한 위젯은 기본적이며 보기에 좋지 않으며 기능이 제한적입니다. 실제로 배송하는 것이 아니라 프로토타입을 만들고 테스트하기 위한 방법입니다.

이전에 PyQt로 작업한 적이 있다면 이러한 위젯을 추가하고 이벤트 핸들러에 연결하는 일반적인 구문과 접근 방식이 상당히 익숙하다는 것을 알 수 있습니다.

버튼 추가

시작하자 버튼 - matplotlib.widgets 모듈은 다음을 정의합니다 Button 수업. 연결하기 위해 호출합니다. on_clicked() 우리가 제공하는 기능을 실행하는 기능. 클릭이 감지되면 기능이 실행됩니다.

버튼을 생성하는 동안 할당합니다. Axes 위치 지정에 사용됩니다. 우리는 또한 통과 할 수 있습니다 label 그 때, 일부 텍스트를 추가하고 사용자를 위해 주석을 달 수 있습니다. 그만큼 colorhovercolor 인수는 버튼을 가리키기 전과 후의 버튼 색상을 정의합니다.

모든 위젯의 위치와 공간을 관리하므로 FigureAxes, 하단에 약간의 간격을 두어 버튼을 추가하고 빈 산점도를 그립니다. 그런 다음 다음을 정의합니다. EventHandler 하나의 메서드만 있는 클래스 add_random(). 이 방법은 두 개의 난수를 생성하고 난수에 대한 마커를 플로팅합니다. Axes 우리는 전에 만들고 호출 plt.draw(), 다시 그리는 Figure. 플롯을 업데이트할 때 항상 plt.draw() 다시 실제로 업데이트하려면 다음을 수행하십시오.

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()

결과적으로 Figure, 빈 Axes 그것의 내부와 화면의 오른쪽 상단 모서리에 있는 버튼, 자체에서 Axes:

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

그리고 버튼을 수십번 누른 후, ax 무작위 마커로 채워집니다:

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

보다 실용적인 측면에서 우리는 주기 각 버튼을 누를 때마다 표시되는 기능. 이것은 몇 가지 조정이 필요합니다 EventHandler, 해당 주기로 돌아갈 수 있는 또 다른 버튼입니다.

사용합시다 적포도주 품질 다시 데이터세트를 만들고 여러 기능을 시각화합니다. 알코올 특징. 한 기능을 다른 기능에 대해 플롯하는 코드를 작성한 다음 다른 기능에 대해 다른 기능을 플롯하도록 해당 코드를 수정하여 개별적으로 플롯하는 데 신경을 쓸 수 없기 때문입니다.

여기에서 Scatter Matrix를 만드는 것이 도움이 될 수 있지만 데이터 세트에 많은 기능이 있는 경우 읽을 수 없고 멀리 가지 않을 것입니다. 갖고 싶다면 쉽게 보고 해석할 수 있는 대규모 플롯, 게다가 추가 노력 없이 순환하는 여러 기능이 있으므로 버튼을 사용하여 이 프로세스를 자동화할 수 있습니다.

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()

XNUMXD덴탈의 EventHandler 클래스에는 이제 두 가지 방법이 있습니다. next_feature()previous_feature(). 이 두 가지 모두 카운터가 i 열 목록의 끝 또는 시작에 도달했습니다. IndexError, 인덱스를 반대 값으로 재설정하고 시뮬레이션 주기. 아래로 이동 0 우리를 다시 end 열 목록에서 마지막 열 위로 이동하면 첫 번째 열로 되돌아갑니다.

우리의 위치를 ​​확인한 후 – 우리는 클리어 Axes, 다음을 통해 지우지 않고 기존 플롯 위에 다시 플롯할 것이기 때문에 cla() (cla엑스). 대안으로 서로의 위에 플로팅하고 다음을 사용하여 피쳐 관계를 쌓을 수도 있습니다. cla() 주기의 끝/시작 시 인덱스를 재설정할 때의 문입니다.

클리어 후 Axes – 우리는 페인트 칠할 깨끗한 캔버스를 가지고 있습니다. ax.scatter() 함수. 이 예에서 고정된 기능은 알코올, 그래서 항상 존재합니다. 다른 기능은 다양하며 다음을 통해 액세스할 수 있습니다. iloc[], 열의 인덱스를 전달합니다. 이것은 반환 Series 이 플롯에서 사용할 수 있습니다. 마찬가지로 우리는 액세스 할 수 있습니다 열 이름 인덱스를 통해서도 – df.columns[index], Y축 레이블을 설정하는 데 사용됩니다.

마지막으로 카운터를 증가/감소시키고 호출합니다. plt.draw() 업데이트 Figure:

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

클릭하면 다음 기능 버튼을 클릭하면 열 목록의 다음 기능이 플로팅됩니다. 알코올Figure 라벨, 마커 및 스케일이 적절하게 업데이트됩니다. 반대 방향도 마찬가지입니다 - 이전 기능 목록을 반대 방향으로 탐색하여 주기의 끝이나 시작에 도달할 때마다 카운터를 재설정하는 안전 메커니즘을 사용하여 앞뒤로 순환할 수 있습니다.

라디오 버튼 및 확인란 추가

라디오 버튼 사용자가 선택할 수 있도록 하는 데 사용됩니다. 하나의 가치 밖으로 여러 값. 한 번에 하나의 라디오 버튼만 선택할 수 있으며 일반적으로 선택 항목을 나타냅니다. 확인란 사용자가 한 번에 여러 옵션을 선택할 수 있도록 하려면 사용할 수 있습니다.

참고 : 확인란이 선택되어 있는지 여부를 확인하는 기능은 매우 제한적입니다. on or 오프. 사실, 아무 것도 없습니다. 상자인지 여부만 확인할 수 있습니다. 프레스 or 지원, 그 이전에 어떤 상태였는지 알 수 없기 때문에 사용 방법에 심각한 제한이 있습니다. 유일한 대안은 부울로 상자의 현재 상태에 대한 카운터/체크를 유지하고 이를 기반으로 논리를 변경하는 것입니다.

예를 들어 각 항목에 대한 확인란을 추가할 수 있습니다. 사용자 정의 인수 사용자가 설정할 수 있는 특정 플롯의 True or False (선택 또는 선택 취소) 또는 이러한 상태를 기반으로 하는 충돌하지 않는 기타 매핑.

하지만 API 자체가 제한되어 있기 때문에 우리는 의도한 용도로 제한할 것입니다. 즉, 켜고 끌 것입니다. 두 가지 기능이 있습니다. on오프 체크박스를 통해 이 기능도 개체가 표시되는지 여부를 확인할 수 있는 개체로 제한됩니다.

반면에 우리는 사용자가 한 번에 두 개의 척도를 적용하거나 두 개의 X-한계를 한 번에 설정하는 것을 허용하지 않습니다. 왜냐하면 시퀀스에서 두 번째라는 명령문만 적용되기 때문입니다. 이를 위해 라디오 버튼을 사용합니다.

사용자가 몇 개의 라디오 버튼을 통해 축 범위를 선택할 수 있도록 몇 개의 라디오 버튼을 추가하고 기능 시각화를 전환할 수도 있습니다. on오프:

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()

다시 말하지만, 우리는 두 가지 방법을 가지고 있습니다 EventHandler() 수업 - set_range()apply_features(). 그만큼 set_range() 방법을 조정하여 범위를 "작은" 또는 "큰"으로 설정합니다. Axes' X 및 Y 제한. 그만큼 apply_features() 기능이 변경 visible 현재를 기반으로 이전에 만든 Line Plots의 필드 visible 상태. 만약에 visible == True, Line Plot을 끄고 그 반대도 마찬가지입니다.

이전에 확인란이 선택되었는지 여부를 확인할 수 없기 때문에 Line Plots의 가시성을 확인하는 내장 기능에 의존해야 합니다. 이 동일한 능력은 다음과 같이 에뮬레이트될 수 있습니다. status 범위의 부울 EventHandler() 로 설정된 클래스 TrueFalse 클릭할 때마다 기본적으로 보이는지 확인을 지원하지 않는 플롯 유형의 경우.

이 코드를 실행하면 Figure 하단에 두 세트의 버튼이 있습니다. 두 확인란을 모두 선택하면 두 선 그림이 모두 나타납니다.

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

개별적으로 끌 수 있습니다.

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

그리고 우리는 범위를 변경할 수 있습니다 Axes 라디오 버튼을 통해:

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

텍스트 상자 추가

텍스트 상자 ~에 익숙하다 수집 사용자의 데이터 - 이 데이터를 기반으로 플롯을 변경할 수 있습니다. 예를 들어, 사용자에게 기능의 이름을 입력하거나 시각화할 플롯에 대한 함수를 삽입하도록 요청할 수 있습니다. 물론 사용자 입력으로 작업하는 것은 까다로울 수 있습니다. 항상 조심해야 할 경우가 있습니다.

사용자가 입력할 수 있는 스크립트를 작성해 보겠습니다. 기능 이름 데이터 세트의 Axes 입력을 반영하기 위해 각 제출에 대한 업데이트. 사용자의 편의를 위해 입력이 열 이름과 일치하지 않으면 알려줍니다.

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()

제공되었는지 확인하는 간단한 검사가 있습니다. feature_name 비어 있거나 None, 이 경우 우리는 아무 것도 하지 않습니다. 그렇지 않은 경우 feature_name 에 존재 DataFrame, 기능이 없는 경우 해당 기능을 찾을 수 없다는 메시지를 첨부합니다. 그러나 텍스트를 첨부하기 전에 이전 메시지가 제거되었는지 확인하여 새 메시지와 겹치지 않도록 해야 합니다. 그만큼 axes.texts 속성은 모든 Text 인스턴스 Axes. 이후 Axes 이미 가지고있다 Text 예를 들어, 당사에 속한 TextBox, 2개 이하인 경우 아무것도 제거하고 싶지 않습니다. Text 존재하는 인스턴스 – 오류 메시지 및 TextBox 상표.

XNUMX개 이상이면 제거해야 하는 오류 메시지가 이미 있습니다.

기능의 경우 is 현재의 DataFrame하지만, 우리는 Axes 그리고 그것을 플롯:

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

스팬 선택기 추가

스팬 선택기 사용자가 데이터 범위를 선택하고 데이터에 집중할 수 있도록 하여 해당 선택을 기반으로 축 제한을 설정할 수 있습니다. 기본적으로 많은 라이브러리가 이 기능을 지원하지만 불행히도 Matplotlib는 지원하지 않으므로 수동으로 수행해야 합니다. 추가로 추가해야 하는 "재설정" 우리가 원하는 경우 버튼 카메라가 줌렌즈로 화상을 서서히 축소하다 뿐만 아니라.

추가하려면 스팬 선택기, 우리는 완전히 새로운 Axes 그것을 위해 – 우리는 그것을 기존 것에 붙일 수 있습니다. 이것은 많은 의미가 있습니다. 생성할 때 SpanSelector, 우리는 공급 Axes 그것은 이벤트 핸들러뿐만 아니라 속합니다. 'horizontal' or 'vertical', 회전 Axes스팬 선택기 둘 다.

XNUMXD덴탈의 useblit 인수는 일반적으로 다음으로 설정됩니다. True 대부분의 백엔드에서 성능을 향상시키기 때문입니다. 또한 다음과 같은 몇 가지 스타일 지정 속성을 추가했습니다. alpha Span Selector로 생성된 사각형의 0.5 그리고 facecolor 좋은 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()

이것을 실행하면 Axes-limits를 제공된 값으로 설정하여 범위를 선택하고 확대할 수 있는 플롯이 생성됩니다.

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

슬라이더 추가

슬라이더 사용자가 마커를 밀고 값을 선택하여 직관적으로 많은 값 중에서 선택할 수 있습니다. 일반적으로 슬라이더는 범위와 같은 플롯의 일부 값을 지속적으로 업데이트하는 데 사용됩니다. or 심지어 기능. 예를 들어 슬라이더를 통해 상수 값을 조정할 수 있으며 이는 해당 상수에 의존하는 함수에 영향을 줍니다.

슬라이더를 통해 Y 및 X축 제한을 변경할 수 있는 스크립트를 작성해 보겠습니다. 슬라이더를 사용하면 데이터를 보는 관점을 변경할 수 있습니다.

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()

왼쪽과 아래쪽의 슬라이더를 허용하도록 패딩을 조정했습니다. Axes, 그리고 간단한 Line Plot을 그렸습니다. 슬라이더를 추가하려면 Axes 대부분의 다른 위젯과 마찬가지로 이를 위해 ax 의 논쟁 Slider 생성자를 통해. 또한 슬라이더의 최소값, 최대값 및 초기값을 설정할 수 있습니다. 이는 일반적으로 플로팅하는 데이터를 기반으로 하는 동적 범위이지만 수동으로 스칼라 값을 설정할 수도 있습니다.

마지막으로, Sliders는 수평 또는 수직 방향이 될 수 있습니다. 마우스 스와이프를 통해 지속적으로 업데이트해야 하기 때문에 – on_changed() 함수는 사용자가 입력을 제공할 때 응답을 트리거하는 데 사용됩니다. 우리는 조정했습니다 EventHandler 클래스 update() 에 따라 X 및 Y 제한 값을 간단히 조정하는 기능 val각 슬라이더의 ue.

이 코드를 실행하면 두 개의 슬라이더가 있는 플롯이 생성되며, 이를 사용하여 Axes:

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

Matplotlib 위젯 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

타임 스탬프 :

더보기 스택카부스