from PyQt5.QtWidgets import QWidget
from ui_files.pprops import Ui_PProps
import matplotlib as mpl
[docs]class PPropsControl:
def __init__(self, canvas):
self.w_PProps = QWidget()
self.canvas = canvas
self.ppropsUI = Ui_PProps()
self.ppropsUI.setupUi(self.w_PProps)
self.initUI()
self.signals()
self.axins = None
self.indicate_inset = None
[docs] def initUI(self):
self.plot_default_decorations()
[docs] def plot_default_decorations(self):
# plot settings
mpl.rcParams['xtick.labelsize'] = 18
mpl.rcParams['ytick.labelsize'] = 18
mpl.rcParams['axes.labelsize'] = 18
mpl.rcParams['axes.titlesize'] = 18
mpl.rcParams['legend.fontsize'] = 'large'
mpl.rcParams['figure.figsize'] = [9.8, 6]
mpl.rcParams['figure.dpi'] = 100
[docs] def signals(self):
self.ppropsUI.pb_Apply.clicked.connect(lambda: self.apply())
self.ppropsUI.pb_Cancel.clicked.connect(lambda: self.close())
self.ppropsUI.cb_Show_Hide_Inset.clicked.connect(lambda: self.plot_inset())
[docs] def plot_inset(self):
if self.ppropsUI.cb_Show_Hide_Inset.checkState() == 2:
# get lines from axis
lines = self.canvas.ax.get_lines()
# 2HC1FPC (Wakefield)%%3HC1FPC (Wakefield)%%4HC1FPC (Lossy Eigenmode)%%3HC1FPC (Lossy Eigenmode)%%2HC1FPC (Lossy Eigenmode)
# sub region of the original image
# get values from line edit
x0 = self.ppropsUI.dsb_X0.value()
x1 = self.ppropsUI.dsb_X1.value()
y0 = self.ppropsUI.dsb_Y0.value()
y1 = self.ppropsUI.dsb_Y1.value()
# check if inset bounds is within current plot bound
if x0 >= self.canvas.ax.get_xlim()[0] and x1 <= self.canvas.ax.get_xlim()[1] and y0 >= self.canvas.ax.get_ylim()[0] and y1 <= self.canvas.ax.get_ylim()[1]:
inset_pos = [self.ppropsUI.dsb_XPos.value(), self.ppropsUI.dsb_YPos.value(), self.ppropsUI.dsb_XWidth.value(), self.ppropsUI.dsb_YWidth.value()]
if len(inset_pos) == 4:
self.axins = self.canvas.ax.inset_axes(inset_pos, facecolor='#fafafa')
# self.axins.axes.xaxis.set_visible(False)
# self.axins.axes.yaxis.set_visible(False)
for line in lines:
if self.axins:
if line.get_linestyle() == 'None':
self.axins.plot(line.get_xdata(), line.get_ydata(), linestyle='None',
marker=line.get_marker(),
markersize=line.get_ms(), c=line.get_color(), mec=line.get_mec(), alpha=line.get_alpha())
else:
self.axins.plot(line.get_xdata(), line.get_ydata(), ls=line.get_linestyle(), marker=line.get_marker(),
mec=line.get_mec(), linewidth=line.get_lw(), c=line.get_color(), alpha=line.get_alpha())
self.axins.set_xlim(x0, x1)
self.axins.set_ylim(y0, y1)
# self.axins.set_xticklabels('')
# self.axins.set_yticklabels('')
self.axins.set_yscale(self.ppropsUI.cb_Y_Scale.currentText())
self.indicate_inset = self.canvas.ax.indicate_inset_zoom(self.axins, edgecolor="black", label='_nolegend_')
else:
print("Axins bounds not in plot bounds")
else:
if self.indicate_inset:
for x in self.indicate_inset:
if isinstance(x, tuple):
for y in x:
y.remove()
else:
x.remove()
if self.axins:
self.axins.cla()
self.axins.remove()
self.axins = None
self.canvas.draw_idle()
[docs] def draw_legend(self):
legend = self.canvas.ax.get_legend()
if legend:
legend.remove()
[docs] def close(self):
self.w_PProps.close()
[docs] def apply(self):
self.canvas.ax.tick_params(axis='x', labelsize=self.ppropsUI.sb_XTick.value())
self.canvas.ax.tick_params(axis='y', labelsize=self.ppropsUI.sb_YTick.value())
self.canvas.ax.set_xlabel(self.ppropsUI.le_XLabel.text(), fontsize=self.ppropsUI.sb_XLabel.value())
self.canvas.ax.set_ylabel(self.ppropsUI.le_YLabel.text(), fontsize=self.ppropsUI.sb_YLabel.value())
self.canvas.ax.set_title(self.ppropsUI.le_Title.text(), fontsize=self.ppropsUI.sb_Title.value())
# legend
legend_labels = self.ppropsUI.le_Legend.text().split("%%")
# update legend
handles, labels = self.canvas.ax.get_legend_handles_labels()
try:
for i in range(len(legend_labels)):
labels[i] = legend_labels[i] if legend_labels[i] != "" else labels[i]
except IndexError:
pass
self.leg = self.canvas.ax_right.legend(handles, labels, fontsize=self.ppropsUI.sb_Legend.text())
self.leg.set_zorder(10)
self.leg.set_draggable(state=True, use_blit=True)
self.draw_legend()
self.canvas.fig.tight_layout()
self.canvas.draw_idle()