Я столкнулся с проблемой, которую не знаю, как правильно решить.
Я пытаюсь создать в окне набор подсюжетов, которые могут перемещаться по щелчку мыши. Функционал должен работать следующим образом: в «центре» холста появляется 1 основной сюжет. Сбоку появляются 3 второстепенных сюжета. При нажатии на второстепенные окна график меняет свое положение с большим и становится большим.
Несколько проблем, с которыми я столкнулся по пути:
Как определить, какое из сюжеты - это сейчас большой сюжет? (figure.get_axes(), очевидно, всегда возвращает оси в том порядке, в котором они были созданы)
Могу ли я настроить сетку оси после ее создания?
Есть ли способ построить существующую ось в новой подзаголовок с указанной спецификацией сетки?
(Я не знаю, могу ли я просто использовать set_position для оси, поскольку размер разных осей в разных подзаголовках различается)
Вот мой код , не стесняйтесь тестировать и экспериментировать.
Большое спасибо
from PySide6 import QtWidgets
import sys
import traceback
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg
import matplotlib.pyplot as plt
import matplotlib.figure
import matplotlib.gridspec as gridspec
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setFixedSize(650, 650)
self.figure = matplotlib.figure.Figure(figsize=(5,5))
self.canvas = FigureCanvasQTAgg(self.figure)
self.setCentralWidget(self.canvas)
ax1 = self.figure.add_subplot(1, 2, 1)
ax2 = self.figure.add_subplot(3, 4, 4)
ax3 = self.figure.add_subplot(3, 4, 8)
ax4 = self.figure.add_subplot(3, 4, 12)
ax1.plot([1, 2, 3], [1, 2, 3], color='r')
ax1.set_title('1')
ax2.plot([1, 2, 3], [1, 2, 3], color='g')
ax2.set_title('2')
ax3.plot([1, 2, 3], [1, 2, 3], color='y')
ax3.set_title('3')
ax4.plot([1, 2, 3], [1, 2, 3], color='b')
ax4.set_title('4')
plt.tight_layout()
cid = self.figure.canvas.mpl_connect('button_press_event', self.onclick)
def onclick(self, event):
for ax in self.figure.get_axes():
ax_i = ax.get_gridspec().get_geometry()[0]
ax_j = ax.get_gridspec().get_geometry()[1]
ax_k = ax.get_subplotspec().num1 + 1
if ax_i == 1 and ax_j == 2 and ax_k == 1:
big_ax_i = ax_i
big_ax_j = ax_j
big_ax_k = ax_k
big_ax = ax
for ax in self.figure.get_axes():
if ax == event.inaxes:
if not ax == big_ax:
title_big_ax = big_ax.get_title()
lines_big_ax = big_ax.get_lines()
xdata_big_ax = [line.get_xdata() for line in lines_big_ax]
ydata_big_ax = [line.get_ydata() for line in lines_big_ax]
color_big_ax = [line.get_color() for line in lines_big_ax]
big_ax.remove()
title_ax = ax.get_title()
lines_ax = ax.get_lines()
xdata_ax = [line.get_xdata() for line in lines_ax]
ydata_ax = [line.get_ydata() for line in lines_ax]
color_ax = [line.get_color() for line in lines_ax]
ax_i = ax.get_gridspec().get_geometry()[0]
ax_j = ax.get_gridspec().get_geometry()[1]
ax_k = ax.get_subplotspec().num1 + 1
ax.remove()
new_big = self.figure.add_subplot(big_ax_i, big_ax_j, big_ax_k)
new_big.set_title(title_ax)
for x, y, c in zip(xdata_ax, ydata_ax, color_ax):
new_big.plot(x, y, color=c)
new_ax = self.figure.add_subplot(ax_i, ax_j, ax_k)
new_ax.set_title(title_big_ax)
for x, y, c in zip(xdata_big_ax, ydata_big_ax, color_big_ax):
new_ax.plot(x, y, color=c)
self.canvas.draw()
def excepthook(exc_type, exc_value, exc_tb):
tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
print("error caught!:")
print("error message:\n", tb)
QtWidgets.QApplication.quit()
sys.excepthook = excepthook
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
ret = app.exec()
sys.exit(ret)
Сейчас у меня есть это решение, но оно уничтожает оси, собирает строки и вместо этого создает новые подграфики. Если я перенесу эту функциональность из демо-версии в программу, графики могут стать более сложными, и тогда сбор линий может оказаться не лучшей идеей. Мне кажется, лучше сохранить ось и изменить ее положение относительно сетки.
Я столкнулся с проблемой, которую не знаю, как правильно решить. Я пытаюсь создать в окне набор подсюжетов, которые могут перемещаться по щелчку мыши. Функционал должен работать следующим образом: в «центре» холста появляется 1 основной сюжет. Сбоку появляются 3 второстепенных сюжета. При нажатии на второстепенные окна график меняет свое положение с большим и становится большим. Несколько проблем, с которыми я столкнулся по пути: Как определить, какое из сюжеты - это сейчас большой сюжет? (figure.get_axes(), очевидно, всегда возвращает оси в том порядке, в котором они были созданы) Могу ли я настроить сетку оси после ее создания? Есть ли способ построить существующую ось в новой подзаголовок с указанной спецификацией сетки? (Я не знаю, могу ли я просто использовать set_position для оси, поскольку размер разных осей в разных подзаголовках различается) Вот мой код , не стесняйтесь тестировать и экспериментировать. Большое спасибо [code]from PySide6 import QtWidgets import sys import traceback from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg import matplotlib.pyplot as plt import matplotlib.figure import matplotlib.gridspec as gridspec class MainWindow(QtWidgets.QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setFixedSize(650, 650) self.figure = matplotlib.figure.Figure(figsize=(5,5)) self.canvas = FigureCanvasQTAgg(self.figure) self.setCentralWidget(self.canvas) ax1 = self.figure.add_subplot(1, 2, 1) ax2 = self.figure.add_subplot(3, 4, 4) ax3 = self.figure.add_subplot(3, 4, 8) ax4 = self.figure.add_subplot(3, 4, 12) ax1.plot([1, 2, 3], [1, 2, 3], color='r') ax1.set_title('1') ax2.plot([1, 2, 3], [1, 2, 3], color='g') ax2.set_title('2') ax3.plot([1, 2, 3], [1, 2, 3], color='y') ax3.set_title('3') ax4.plot([1, 2, 3], [1, 2, 3], color='b') ax4.set_title('4') plt.tight_layout() cid = self.figure.canvas.mpl_connect('button_press_event', self.onclick)
def onclick(self, event): for ax in self.figure.get_axes(): ax_i = ax.get_gridspec().get_geometry()[0] ax_j = ax.get_gridspec().get_geometry()[1] ax_k = ax.get_subplotspec().num1 + 1 if ax_i == 1 and ax_j == 2 and ax_k == 1: big_ax_i = ax_i big_ax_j = ax_j big_ax_k = ax_k big_ax = ax
for ax in self.figure.get_axes(): if ax == event.inaxes: if not ax == big_ax: title_big_ax = big_ax.get_title() lines_big_ax = big_ax.get_lines() xdata_big_ax = [line.get_xdata() for line in lines_big_ax] ydata_big_ax = [line.get_ydata() for line in lines_big_ax] color_big_ax = [line.get_color() for line in lines_big_ax] big_ax.remove()
title_ax = ax.get_title() lines_ax = ax.get_lines() xdata_ax = [line.get_xdata() for line in lines_ax] ydata_ax = [line.get_ydata() for line in lines_ax] color_ax = [line.get_color() for line in lines_ax] ax_i = ax.get_gridspec().get_geometry()[0] ax_j = ax.get_gridspec().get_geometry()[1] ax_k = ax.get_subplotspec().num1 + 1 ax.remove()
new_big = self.figure.add_subplot(big_ax_i, big_ax_j, big_ax_k) new_big.set_title(title_ax) for x, y, c in zip(xdata_ax, ydata_ax, color_ax): new_big.plot(x, y, color=c)
new_ax = self.figure.add_subplot(ax_i, ax_j, ax_k) new_ax.set_title(title_big_ax) for x, y, c in zip(xdata_big_ax, ydata_big_ax, color_big_ax): new_ax.plot(x, y, color=c)
[/code] Сейчас у меня есть это решение, но оно уничтожает оси, собирает строки и вместо этого создает новые подграфики. Если я перенесу эту функциональность из демо-версии в программу, графики могут стать более сложными, и тогда сбор линий может оказаться не лучшей идеей. Мне кажется, лучше сохранить ось и изменить ее положение относительно сетки.
В настоящее время я пытаюсь создать трехпанельную фигуру, где центральный график содержит контурный график, а верхние левая и правая панели показывают несколько линий. Дело в том, что все графики повернуты на 45 градусов по часовой стрелке....
В настоящее время я пытаюсь создать трехпанельную фигуру, где центральный график содержит контурный график, а верхние левая и правая панели показывают несколько линий. Дело в том, что все графики повернуты на 45 градусов по часовой стрелке....
Я хотел бы добавить информацию версии ко всем цифрам, которые генерируются из сценария. Скрипт, но я часто использую интерактивное окно Matplotlib и сохраняю оттуда фигуры.
У меня есть несколько переключателей для выбора цвета и ширины строки во встроенном графике. Я не могу очистить график, когда выбираю новый цвет или ширину, и новый график размещается под исходным графиком. Я, вероятно, усложнил ситуацию, используя...
Я пытаюсь показать два интерактивных сюжета. Второй сюжет отображается после того, как первый сюжет закрыт. В этом минимальном примере интерактивная часть просто рисует точку, где бы пользователь нажимает и печатает координаты в консоли.
import...