Как заполнить прямоугольник, нарисованный поверх гистограммы (Tkinter Python) - PullRequest
0 голосов
/ 13 декабря 2018

Я строю графический интерфейс с использованием Tkinter в Python.Мне нужно нарисовать прямоугольник поверх гистограммы и заполнить пространство прозрачным цветом.Я дошел до точки добавления прямоугольника к гистограмме, но изо всех сил пытался заполнить прямоугольное пространство цветом.Ниже приведен пример файла данных:

Файл данных (dummy.csv):

Val X   Y
4.386535946 4.386535946 2.362683533
3.230578487 3.230578487 1.927068162
2.67663787  2.67663787  1.300859395
2.236096646 2.236096646 1.477402735
1.963946814 1.963946814 1.498125697
1.779245978 1.779245978 0.199055215
-1.38320155 1.159057936 1.38320155
-1.417788412    0.605276953 1.417788412
-1.471051567    1.013028135 1.471051567
-1.477383756    0.996565505 1.477383756
-1.601125344    0.963508674 1.601125344
-3.145657478    0.5902837   3.145657478
-3.241919109    2.796858598 3.241919109

Я публикую код ниже.Буду очень признателен, если вы поможете мне решить головоломку

import tkinter as tk
import pandas as pd

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

class BarGUI(tk.Frame):
    def __init__(self, parent_container):
        tk.Frame.__init__(self, parent_container)        

        self.parent_container = parent_container

        self.fig = Figure(figsize=(7, 3))
        self.a = self.fig.add_subplot(111)

        self.canvas = FigureCanvasTkAgg(self.fig, master=self.parent_container)
        self.canvas.get_tk_widget().grid(column = 0, row = 0, padx = 40, pady = 0)

        tk.Button(self.parent_container, text = "Draw", width = 10, command = self.plot).grid(column = 0, row = 1)


    def read_inputs(self):
        df = pd.read_csv('dummy.csv')
        data = list(df.loc[:, 'Val'])
        data.sort(reverse = True)
        ind = np.arange(len(data))  # the x locations for the groups
        width = 0.95
        return (ind, data, width)


    def plot(self):
        self.a.cla()

        ind, data, width = self.read_inputs()
        self.a.bar(ind, data, width)

        self.a.plot([-1, 13], [1, 1], color = 'orange')
        self.a.plot([13, 13], [1, -1], color = 'orange')
        self.a.plot([13, -1], [-1, -1], color = 'orange')
        self.a.plot([-1, -1], [-1, 1], color = 'orange')

        self.a.set_title ("Scatter Plot", fontsize=16)
        self.a.set_ylabel("Y", fontsize=14)
        self.a.set_xlabel("X", fontsize=14)

        self.canvas.draw()        


root = tk.Tk()
app_window = BarGUI(root)            
root.mainloop()

1 Ответ

0 голосов
/ 13 декабря 2018

Вместо того, чтобы рисовать линии для рисования прямоугольника, вы можете использовать прямоугольный патч:

Поместите

    rect = Rectangle((-1, -1), 14, 2, color='orange', fill=True, alpha=0.5)
    self.a.add_artist(rect)

вместо

    self.a.plot([-1, 13], [1, 1], color = 'orange')
    self.a.plot([13, 13], [1, -1], color = 'orange')
    self.a.plot([13, -1], [-1, -1], color = 'orange')
    self.a.plot([-1, -1], [-1, 1], color = 'orange')

в plot()метод.Вам нужно будет добавить оператор импорта from matplotlib.patches import Rectangle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...