def Stat(self): df = self._df m = ['Width', 'Style', 'Alpha', 'Size', 'Color', 'Marker', 'Author'] for i in m: if i in df.columns.values: df = df.drop(i, 1) df.set_index('Label', inplace=True) items = df.columns.values index = df.index.values StatResultDict = {} for i in items: StatResultDict[i] = self.stateval(df[i]) StdSortedList = sorted(StatResultDict.keys(), key=lambda x: StatResultDict[x]['std']) StdSortedList.reverse() for k in sorted(StatResultDict.keys(), key=lambda x: StatResultDict[x]['std']): print("%s=%s" % (k, StatResultDict[k])) StatResultDf = pd.DataFrame.from_dict(StatResultDict, orient='index') StatResultDf['Items'] = StatResultDf.index.tolist() self.tablepop = TabelViewer(df=StatResultDf, title='X-Y Statistical Result') self.tablepop.show() self.Intro = StatResultDf return (StatResultDf)
def Stat(self): df=self._df m = ['Width', 'Style', 'Alpha', 'Size', 'Color', 'Marker', 'Author'] for i in m: if i in df.columns.values: df = df.drop(i, 1) df.set_index('Label', inplace=True) items = df.columns.values index = df.index.values StatResultDict = {} for i in items: StatResultDict[i] = self.stateval(df[i]) StdSortedList = sorted(StatResultDict.keys(), key=lambda x: StatResultDict[x]['std']) StdSortedList.reverse() StatResultDf = pd.DataFrame.from_dict(StatResultDict, orient='index') StatResultDf['Items']=StatResultDf.index.tolist() self.tablepop = TabelViewer(df=StatResultDf,title='Statistical Result') self.tablepop.show() self.Intro = StatResultDf return(StatResultDf)
def Explain(self): #self.OutPutData = self.OutPutData.set_index('Label') self.tablepop = TabelViewer(df=self.OutPutData, title='TAS Result') self.tablepop.show()
class TAS(AppForm): _df = pd.DataFrame() _changed = False xlabel = r'$SiO_2 wt\%$' ylabel = r'$Na_2O + K_2O wt\%$' itemstocheck = ['SiO2', 'K2O', 'Na2O'] reference = 'Reference: Maitre, R. W. L., Streckeisen, A., Zanettin, B., Bas, M. J. L., Bonin, B., and Bateman, P., 2004, Igneous Rocks: A Classification and Glossary of Terms: Cambridge University Press, v. -1, no. 70, p. 93–120.' ItemNames = [ 'Foidolite', 'Peridotgabbro', 'Foid Gabbro', 'Foid Monzodiorite', 'Foid Monzosyenite', 'Foid Syenite', 'Gabbro Bs', 'Gabbro Ba', 'Monzogabbro', 'Monzodiorite', 'Monzonite', 'Syenite', 'Quartz Monzonite', 'Gabbroic Diorite', 'Diorite', 'Granodiorite', 'Granite', 'Quartzolite', ] LocationAreas = [ [[41, 3], [37, 3], [35, 9], [37, 14], [52.5, 18], [52.5, 14], [48.4, 11.5], [45, 9.4], [41, 7]], [[41, 0], [41, 3], [45, 3], [45, 0]], [[41, 3], [41, 7], [45, 9.4], [49.4, 7.3], [45, 5], [45, 3]], [[45, 9.4], [48.4, 11.5], [53, 9.3], [49.4, 7.3]], [[48.4, 11.5], [52.5, 14], [57.6, 11.7], [53, 9.3]], [[52.5, 14], [52.5, 18], [57, 18], [63, 16.2], [61, 13.5], [57.6, 11.7]], [[45, 0], [45, 2], [52, 5], [52, 0]], [[45, 2], [45, 5], [52, 5]], [[45, 5], [49.4, 7.3], [52, 5]], [[49.4, 7.3], [53, 9.3], [57, 5.9], [52, 5]], [[53, 9.3], [57.6, 11.7], [61, 8.6], [63, 7], [57, 5.9]], [[57.6, 11.7], [61, 13.5], [63, 16.2], [71.8, 13.5], [61, 8.6]], [[61, 8.6], [71.8, 13.5], [69, 8], [63, 7]], [[52, 0], [52, 5], [57, 5.9], [57, 0]], [[57, 0], [57, 5.9], [63, 7], [63, 0]], [[63, 0], [63, 7], [69, 8], [77.3, 0]], [[77.3, 0], [69, 8], [71.8, 13.5], [85.9, 6.8], [87.5, 4.7]], [[77.3, 0], [87.5, 4.7], [90, 4.7], [90, 0]], ] AreasHeadClosed = [] SelectDic = {} TypeList = [] def create_main_frame(self): self.resize(800, 600) self.main_frame = QWidget() self.dpi = 128 self.fig = Figure((18.0, 12.0), dpi=self.dpi) self.fig.subplots_adjust(hspace=0.5, wspace=0.5, left=0.1, bottom=0.2, right=0.7, top=0.9) self.canvas = FigureCanvas(self.fig) self.canvas.setParent(self.main_frame) self.axes = self.fig.add_subplot(111) self.axes.axis('off') # Create the navigation toolbar, tied to the canvas self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame) # Other GUI controls self.load_data_button = QPushButton('&Add Data to Compare') self.load_data_button.clicked.connect(self.loadDataToTest) self.save_button = QPushButton('&Save Img') self.save_button.clicked.connect(self.saveImgFile) self.result_button = QPushButton('&Classification Result') self.result_button.clicked.connect(self.Explain) self.legend_cb = QCheckBox('&Legend') self.legend_cb.setChecked(True) self.legend_cb.stateChanged.connect(self.TAS) # int self.irvine_cb = QCheckBox('&Irvine') self.irvine_cb.setChecked(True) self.irvine_cb.stateChanged.connect(self.TAS) # int self.tag_cb = QCheckBox('&Tag') self.tag_cb.setChecked(True) self.tag_cb.stateChanged.connect(self.TAS) # int self.shape_cb = QCheckBox('&Shape') self.shape_cb.setChecked(False) self.shape_cb.stateChanged.connect(self.TAS) # int self.hyperplane_cb = QCheckBox('&Hyperplane') self.hyperplane_cb.setChecked(False) self.hyperplane_cb.stateChanged.connect(self.TAS) # int self.slider_left_label = QLabel('Volcanic') self.slider_right_label = QLabel('Plutonic') self.slider = QSlider(Qt.Horizontal) self.slider.setRange(0, 1) self.slider.setValue(0) self.slider.setTracking(True) self.slider.setTickPosition(QSlider.TicksBothSides) self.slider.valueChanged.connect(self.TAS) # int # # Layout with box sizers # self.hbox = QHBoxLayout() for w in [ self.load_data_button, self.save_button, self.result_button, self.shape_cb, self.legend_cb, self.tag_cb, self.irvine_cb, self.slider_left_label, self.slider, self.slider_right_label ]: self.hbox.addWidget(w) self.hbox.setAlignment(w, Qt.AlignVCenter) self.vbox = QVBoxLayout() self.vbox.addWidget(self.mpl_toolbar) self.vbox.addWidget(self.canvas) self.vbox.addLayout(self.hbox) self.textbox = GrowingTextEdit(self) self.textbox.setText(self.reference) self.vbox.addWidget(self.textbox) self.main_frame.setLayout(self.vbox) self.setCentralWidget(self.main_frame) w = self.width() h = self.height() self.slider.setFixedWidth(w / 10) def Irvine(self, x, a=39.0, b=3.9492, c=-2.1111, d=0.86096, e=-0.15188, f=0.012030, g=-(3.3539 / 10000)): return (a + b * np.power(x, 1) + c * np.power(x, 2) + d * np.power(x, 3) + e * np.power(x, 4) + f * np.power(x, 5) + g * np.power(x, 6)) pass def loadDataToTest(self): TMP = self.getDataFile() if TMP != 'Blank': self.data_to_test = TMP[0] self.TAS() def TAS(self, Left=35, Right=79, X0=30, X1=90, X_Gap=7, Base=0, Top=19, Y0=1, Y1=19, Y_Gap=19, FontSize=12, xlabel=r'$SiO_2 wt\%$', ylabel=r'$Na_2O + K_2O wt\%$', width=12, height=12, dpi=300): self.setWindowTitle( 'TAS (total alkali–silica) diagram Volcanic/Plutonic (Wilson et al. 1989)' ) self.axes.clear() #self.axes.axis('off') self.axes.set_xlabel(self.xlabel) self.axes.set_ylabel(self.ylabel) self.axes.spines['right'].set_color('none') self.axes.spines['top'].set_color('none') self.axes.set_xticks([30, 40, 50, 60, 70, 80, 90]) self.axes.set_xticklabels([30, 40, 50, 60, 70, 80, 90]) self.axes.set_yticks([0, 5, 10, 15, 20]) self.axes.set_yticklabels([0, 5, 10, 15, 20]) self.axes.set_ylim(bottom=0) all_labels = [] all_colors = [] all_markers = [] all_alpha = [] for i in range(len(self._df)): target = self._df.at[i, 'Label'] color = self._df.at[i, 'Color'] marker = self._df.at[i, 'Marker'] alpha = self._df.at[i, 'Alpha'] if target not in all_labels: all_labels.append(target) all_colors.append(color) all_markers.append(marker) all_alpha.append(alpha) self.whole_labels = all_labels YIrvine = np.arange(0, 10.2, 0.1) XIrvine = self.Irvine(YIrvine) PointLabels = [] PointColors = [] x = [] y = [] Locations = [(39, 10), (43, 1.5), (44, 6), (47.5, 3.5), (49.5, 1.5), (49, 5.2), (49, 9.5), (54, 3), (53, 7), (53, 12), (60, 4), (57, 8.5), (57, 14), (67, 5), (65, 12), (67, 9), (75, 9), (85, 1), (55, 18.5)] X_offset = -6 Y_offset = 3 if (int(self.slider.value()) == 0): Labels = [ u'F', u'Pc', u'U1', u'Ba', u'Bs', u'S1', u'U2', u'O1', u'S2', u'U3', u'O2', u'S3', u'Ph', u'O3', u'T', u'Td', u'R', u'Q', u'S/N/L' ] title = 'TAS (total alkali–silica) diagram Volcanic (after Wilson et al. 1989).' description = '\n' \ 'F: Foidite, Ph: Phonolite, Pc Pocrobasalt, U1: Tephrite (ol < 10%) Basanite(ol > 10%), U2: Phonotephrite, U3: Tephriphonolite,\n' \ 'Ba: alkalic basalt,Bs: subalkalic baslt, S1: Trachybasalt, S2: Basaltic Trachyandesite, S3: Trachyandesite,\n' \ 'O1: Basaltic Andesite, O2: Andesite, O3 Dacite, T: Trachyte , Td: Trachydacite , R: Rhyolite, Q: Silexite \n' \ 'S/N/L: Sodalitite/Nephelinolith/Leucitolith' self.setWindowTitle(title) self.textbox.setText(self.reference + description) else: Labels = [ u'F', u'Pc', u'U1', u'Ba', u'Bs', u'S1', u'U2', u'O1', u'S2', u'U3', u'O2', u'S3', u'Ph', u'O3', u'T', u'Td', u'R', u'Q', u'T/U/I' ] title = 'TAS (total alkali–silica) diagram Plutonic (after Wilson et al. 1989).' description = '\n' \ 'F: Foidolite, Ph: Foid Syenite, Pc: Peridotgabbro, U1: Foid Gabbro, U2: Foid Monzodiorite, U3: Foid Monzosyenite,\n' \ 'Ba: alkalic gabbro,Bs: subalkalic gabbro, S1: Monzogabbro, S2: Monzodiorite, S3: Monzonite,\n' \ 'O1: Gabbroic Diorite, O2: Diorite, O3: Graodiorite, T: Syenite , Td: Quartz Monzonite , R: Granite, Q: Quartzolite \n' \ 'T/U/I: Tawite/Urtite/Italite' self.setWindowTitle(title) self.textbox.setText(self.reference + description) TagNumber = min(len(Labels), len(Locations)) if (self.tag_cb.isChecked()): for k in range(TagNumber): self.axes.annotate(Labels[k], Locations[k], xycoords='data', xytext=(X_offset, Y_offset), textcoords='offset points', fontsize=9, color='grey', alpha=0.8) self.DrawLine([(41, 0), (41, 3), (45, 3)]) self.DrawLine([(45, 0), (45, 3), (45, 5), (49.4, 7.3), (53, 9.3), (57.6, 11.7), (61, 13.5), (63, 16.2)], ) self.DrawLine([(52, 5), (57, 5.9), (63, 7), (69, 8), (71.8, 13.5), (61, 8.6)]) self.DrawLine([(45, 2), (45, 5), (52, 5), (45, 2)]) self.DrawLine([(69, 8), (77.3, 0), (87.5, 4.7), (85.9, 6.8), (71.8, 13.5), (63, 16.2), (57, 18), (52.5, 18), (37, 14), (35, 9), (37, 3), (41, 3)]) self.DrawLine([(63, 0), (63, 7), (57.6, 11.7), (52.5, 14), (52.5, 18)]) self.DrawLine([(57, 0), (57, 5.9), (53, 9.3), (48.4, 11.5)]) self.DrawLine([(52, 0), (52, 5), (49.4, 7.3), (45, 9.4)]) self.DrawLine([(41, 3), (41, 7), (45, 9.4)]) self.DrawLine([(45, 9.4), (48.4, 11.5), (52.5, 14)]) # self.DrawLine([(41.75, 1), (52.5, 5)]) # self.DrawLine([(45.85, 2.75), (46.85, 3.0), (50.0, 4.0), (53.1, 5.0), (55.0, 5.8), (55.6, 6.0), (60.0, 6.8),(61.5, 7.0), (65.0, 7.35), (70.0, 7.85), (71.6, 8.0), (75.0, 8.3), (76.4, 8.4)]) # self.DrawLine([(45.85, 2.75), (46.85, 3.0), (50.0, 4.0), (53.1, 5.0), (55.0, 5.8), (55.6, 6.0), (60.0, 6.8),(61.5, 7.0), (65.0, 7.35), (70.0, 7.85), (71.6, 8.0), (75.0, 8.3), (76.4, 8.4)]) # self.DrawLine([(39.8, 0.35), (65.6, 9.7)]) # self.DrawLine([(39.2, 0.0), (40.0, 0.4), (43.2, 2.0), (45.0, 2.8), (48.0, 4.0), (50.0, 4.75), (53.7, 6.0),(55.0, 6.4), (60.0, 8.0), (65.0, 8.8)]) self.Check() if self.OutPutCheck == True: pass if (self._changed): df = self.CleanDataFile(self._df) for i in range(len(df)): TmpLabel = '' if (df.at[i, 'Label'] in PointLabels or df.at[i, 'Label'] == ''): TmpLabel = '' else: PointLabels.append(df.at[i, 'Label']) TmpLabel = df.at[i, 'Label'] TmpColor = '' if (df.at[i, 'Color'] in PointColors or df.at[i, 'Color'] == ''): TmpColor = '' else: PointColors.append(df.at[i, 'Color']) TmpColor = df.at[i, 'Color'] x.append(df.at[i, 'SiO2']) y.append(df.at[i, 'Na2O'] + df.at[i, 'K2O']) Size = df.at[i, 'Size'] Color = df.at[i, 'Color'] # print(Color, df.at[i, 'SiO2'], (df.at[i, 'Na2O'] + df.at[i, 'K2O'])) Alpha = df.at[i, 'Alpha'] Marker = df.at[i, 'Marker'] Label = df.at[i, 'Label'] xtest = df.at[i, 'SiO2'] ytest = df.at[i, 'Na2O'] + df.at[i, 'K2O'] for j in self.ItemNames: if self.SelectDic[j].contains_point([xtest, ytest]): self.LabelList.append(Label) self.TypeList.append(j) break pass self.axes.scatter(df.at[i, 'SiO2'], (df.at[i, 'Na2O'] + df.at[i, 'K2O']), marker=df.at[i, 'Marker'], s=df.at[i, 'Size'], color=df.at[i, 'Color'], alpha=df.at[i, 'Alpha'], label=TmpLabel, edgecolors='black') XtoFit = {} YtoFit = {} SVM_X = [] SVM_Y = [] for i in PointLabels: XtoFit[i] = [] YtoFit[i] = [] for i in range(len(df)): Alpha = df.at[i, 'Alpha'] Marker = df.at[i, 'Marker'] Label = df.at[i, 'Label'] xtest = df.at[i, 'SiO2'] ytest = df.at[i, 'Na2O'] + df.at[i, 'K2O'] XtoFit[Label].append(xtest) YtoFit[Label].append(ytest) SVM_X.append(xtest) SVM_Y.append(ytest) if (self.shape_cb.isChecked()): for i in PointLabels: if XtoFit[i] != YtoFit[i]: xmin, xmax = min(XtoFit[i]), max(XtoFit[i]) ymin, ymax = min(YtoFit[i]), max(YtoFit[i]) DensityColorMap = 'Greys' DensityAlpha = 0.1 DensityLineColor = PointColors[PointLabels.index(i)] DensityLineAlpha = 0.3 # Peform the kernel density estimate xx, yy = np.mgrid[xmin:xmax:200j, ymin:ymax:200j] # print(self.ShapeGroups) # command='''xx, yy = np.mgrid[xmin:xmax:'''+str(self.ShapeGroups)+ '''j, ymin:ymax:''' +str(self.ShapeGroups)+'''j]''' # exec(command) # print(xx, yy) positions = np.vstack([xx.ravel(), yy.ravel()]) values = np.vstack([XtoFit[i], YtoFit[i]]) kernelstatus = True try: st.gaussian_kde(values) except Exception as e: self.ErrorEvent(text=repr(e)) kernelstatus = False if kernelstatus == True: kernel = st.gaussian_kde(values) f = np.reshape(kernel(positions).T, xx.shape) # Contourf plot cfset = self.axes.contourf(xx, yy, f, cmap=DensityColorMap, alpha=DensityAlpha) ## Or kernel density estimate plot instead of the contourf plot # self.axes.imshow(np.rot90(f), cmap='Blues', extent=[xmin, xmax, ymin, ymax]) # Contour plot cset = self.axes.contour(xx, yy, f, colors=DensityLineColor, alpha=DensityLineAlpha) # Label plot #self.axes.clabel(cset, inline=1, fontsize=10) if (self.irvine_cb.isChecked()): self.axes.plot(XIrvine, YIrvine, color='black', linewidth=1, linestyle=':', alpha=0.6, label='Irvine, Barragar 1971\n') if (len(self.data_to_test) > 0): for i in range(len(self.data_to_test)): target = self.data_to_test.at[i, 'Label'] if target not in all_labels: all_labels.append(target) tmp_label = self.data_to_test.at[i, 'Label'] else: tmp_label = '' x_load_test = self.data_to_test.at[i, 'SiO2'] y_load_test = self.data_to_test.at[ i, 'Na2O'] + self.data_to_test.at[i, 'K2O'] for j in self.ItemNames: if self.SelectDic[j].contains_point( [x_load_test, y_load_test]): self.LabelList.append( self.data_to_test.at[i, 'Label']) self.TypeList.append(j) break pass self.axes.scatter(self.data_to_test.at[i, 'SiO2'], (self.data_to_test.at[i, 'Na2O'] + self.data_to_test.at[i, 'K2O']), marker=self.data_to_test.at[i, 'Marker'], s=self.data_to_test.at[i, 'Size'], color=self.data_to_test.at[i, 'Color'], alpha=self.data_to_test.at[i, 'Alpha'], label=tmp_label, edgecolors='black') if (self.legend_cb.isChecked()): self.axes.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0, prop=fontprop) if (self.hyperplane_cb.isChecked()): clf = svm.SVC(C=1.0, kernel='linear') svm_x = SVM_X svm_y = SVM_Y print(len(svm_x), len(svm_y), len(df.index)) xx, yy = np.meshgrid( np.arange(min(svm_x), max(svm_x), np.ptp(svm_x) / 100), np.arange(min(svm_y), max(svm_y), np.ptp(svm_y) / 100)) le = LabelEncoder() le.fit(df.index) class_label = le.transform(df.index) svm_train = pd.concat( [pd.DataFrame(svm_x), pd.DataFrame(svm_y)], axis=1) svm_train = svm_train.values clf.fit(svm_train, class_label) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) self.axes.contourf(xx, yy, Z, cmap='hot', alpha=0.2) self.canvas.draw() self.OutPutTitle = 'TAS' self.OutPutData = pd.DataFrame({ 'Label': self.LabelList, 'RockType': self.TypeList }) self.OutPutFig = self.fig def Explain(self): #self.OutPutData = self.OutPutData.set_index('Label') self.tablepop = TabelViewer(df=self.OutPutData, title='TAS Result') self.tablepop.show()
class TAS(AppForm): _df = pd.DataFrame() _changed = False xlabel = r'$SiO_2 wt\%$' ylabel = r'$Na_2O + K_2O wt\%$' itemstocheck = ['SiO2', 'K2O', 'Na2O'] reference = 'Reference: Maitre, R. W. L., Streckeisen, A., Zanettin, B., Bas, M. J. L., Bonin, B., and Bateman, P., 2004, Igneous Rocks: A Classification and Glossary of Terms: Cambridge University Press, v. -1, no. 70, p. 93–120.' ItemNames = ['Foidolite', 'Peridotgabbro', 'Foid Gabbro', 'Foid Monzodiorite', 'Foid Monzosyenite', 'Foid Syenite', 'Gabbro Bs', 'Gabbro Ba', 'Monzogabbro', 'Monzodiorite', 'Monzonite', 'Syenite', 'Quartz Monzonite', 'Gabbroic Diorite', 'Diorite', 'Granodiorite', 'Granite', 'Quartzolite', ] LocationAreas = [[[41, 3], [37, 3], [35, 9], [37, 14], [52.5, 18], [52.5, 14], [48.4, 11.5], [45, 9.4], [41, 7]], [[41, 0], [41, 3], [45, 3], [45, 0]], [[41, 3], [41, 7], [45, 9.4], [49.4, 7.3], [45, 5], [45, 3]], [[45, 9.4], [48.4, 11.5], [53, 9.3], [49.4, 7.3]], [[48.4, 11.5], [52.5, 14], [57.6, 11.7], [53, 9.3]], [[52.5, 14], [52.5, 18], [57, 18], [63, 16.2], [61, 13.5], [57.6, 11.7]], [[45, 0], [45, 2], [52, 5], [52, 0]], [[45, 2], [45, 5], [52, 5]], [[45, 5], [49.4, 7.3], [52, 5]], [[49.4, 7.3], [53, 9.3], [57, 5.9], [52, 5]], [[53, 9.3], [57.6, 11.7], [61, 8.6], [63, 7], [57, 5.9]], [[57.6, 11.7], [61, 13.5], [63, 16.2], [71.8, 13.5], [61, 8.6]], [[61, 8.6], [71.8, 13.5], [69, 8], [63, 7]], [[52, 0], [52, 5], [57, 5.9], [57, 0]], [[57, 0], [57, 5.9], [63, 7], [63, 0]], [[63, 0], [63, 7], [69, 8], [77.3, 0]], [[77.3, 0], [69, 8], [71.8, 13.5], [85.9, 6.8], [87.5, 4.7]], [[77.3, 0], [87.5, 4.7], [90, 4.7], [90, 0]], ] AreasHeadClosed = [] SelectDic = {} TypeList=[] def create_main_frame(self): self.resize(800, 600) self.main_frame = QWidget() self.dpi = 128 self.fig = Figure((18.0, 12.0), dpi=self.dpi) self.fig.subplots_adjust(hspace=0.5, wspace=0.5, left=0.1, bottom=0.2, right=0.7, top=0.9) self.canvas = FigureCanvas(self.fig) self.canvas.setParent(self.main_frame) self.axes = self.fig.add_subplot(111) self.axes.axis('off') # Create the navigation toolbar, tied to the canvas self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame) # Other GUI controls self.load_data_button = QPushButton('&Add Data to Compare') self.load_data_button.clicked.connect(self.loadDataToTest) self.save_button = QPushButton('&Save Img') self.save_button.clicked.connect(self.saveImgFile) self.result_button = QPushButton('&Classification Result') self.result_button.clicked.connect(self.Explain) self.legend_cb = QCheckBox('&Legend') self.legend_cb.setChecked(True) self.legend_cb.stateChanged.connect(self.TAS) # int self.irvine_cb = QCheckBox('&Irvine') self.irvine_cb.setChecked(True) self.irvine_cb.stateChanged.connect(self.TAS) # int self.tag_cb = QCheckBox('&Tag') self.tag_cb.setChecked(True) self.tag_cb.stateChanged.connect(self.TAS) # int self.shape_cb= QCheckBox('&Shape') self.shape_cb.setChecked(False) self.shape_cb.stateChanged.connect(self.TAS) # int self.hyperplane_cb= QCheckBox('&Hyperplane') self.hyperplane_cb.setChecked(False) self.hyperplane_cb.stateChanged.connect(self.TAS) # int self.slider_left_label = QLabel('Volcanic') self.slider_right_label = QLabel('Plutonic') self.slider = QSlider(Qt.Horizontal) self.slider.setRange(0, 1) self.slider.setValue(0) self.slider.setTracking(True) self.slider.setTickPosition(QSlider.TicksBothSides) self.slider.valueChanged.connect(self.TAS) # int # # Layout with box sizers # self.hbox = QHBoxLayout() for w in [self.load_data_button,self.save_button, self.result_button,self.shape_cb,self.legend_cb,self.tag_cb,self.irvine_cb, self.slider_left_label, self.slider,self.slider_right_label]: self.hbox.addWidget(w) self.hbox.setAlignment(w, Qt.AlignVCenter) self.vbox = QVBoxLayout() self.vbox.addWidget(self.mpl_toolbar) self.vbox.addWidget(self.canvas) self.vbox.addLayout(self.hbox) self.textbox = GrowingTextEdit(self) self.textbox.setText(self.reference) self.vbox.addWidget(self.textbox) self.main_frame.setLayout(self.vbox) self.setCentralWidget(self.main_frame) w=self.width() h=self.height() self.slider.setFixedWidth(w/10) def Irvine(self,x, a = 39.0, b = 3.9492, c = -2.1111, d = 0.86096, e = -0.15188, f = 0.012030, g = -(3.3539 / 10000)): return(a+ b*np.power(x,1) +c*np.power(x,2) +d*np.power(x,3) +e*np.power(x,4) +f*np.power(x,5) +g*np.power(x,6)) pass def loadDataToTest(self): TMP =self.getDataFile() if TMP != 'Blank': self.data_to_test=TMP[0] self.TAS() def TAS(self, Left=35, Right=79, X0=30, X1=90, X_Gap=7, Base=0, Top=19, Y0=1, Y1=19, Y_Gap=19, FontSize=12, xlabel=r'$SiO_2 wt\%$', ylabel=r'$Na_2O + K_2O wt\%$', width=12, height=12, dpi=300): self.setWindowTitle('TAS (total alkali–silica) diagram Volcanic/Plutonic (Wilson et al. 1989)') self.axes.clear() #self.axes.axis('off') self.axes.set_xlabel(self.xlabel) self.axes.set_ylabel(self.ylabel) self.axes.spines['right'].set_color('none') self.axes.spines['top'].set_color('none') self.axes.set_xticks([30,40,50,60,70,80,90]) self.axes.set_xticklabels([30,40,50,60,70,80,90]) self.axes.set_yticks([0, 5, 10, 15, 20]) self.axes.set_yticklabels([0, 5, 10, 15, 20]) self.axes.set_ylim(bottom=0) all_labels=[] all_colors=[] all_markers=[] all_alpha=[] for i in range(len(self._df)): target = self._df.at[i, 'Label'] color = self._df.at[i, 'Color'] marker = self._df.at[i, 'Marker'] alpha = self._df.at[i, 'Alpha'] if target not in all_labels: all_labels.append(target) all_colors.append(color) all_markers.append(marker) all_alpha.append(alpha) self.whole_labels = all_labels YIrvine= np.arange(0,10.2,0.1) XIrvine= self.Irvine(YIrvine) PointLabels = [] PointColors = [] x = [] y = [] Locations = [(39, 10), (43, 1.5), (44, 6), (47.5, 3.5), (49.5, 1.5), (49, 5.2), (49, 9.5), (54, 3), (53, 7), (53, 12), (60, 4), (57, 8.5), (57, 14), (67, 5), (65, 12), (67, 9), (75, 9), (85, 1), (55, 18.5)] X_offset = -6 Y_offset = 3 if (int(self.slider.value())==0): Labels = [u'F', u'Pc', u'U1', u'Ba', u'Bs', u'S1', u'U2', u'O1', u'S2', u'U3', u'O2', u'S3', u'Ph', u'O3', u'T', u'Td', u'R', u'Q', u'S/N/L'] title = 'TAS (total alkali–silica) diagram Volcanic (after Wilson et al. 1989).' description = '\n' \ 'F: Foidite, Ph: Phonolite, Pc Pocrobasalt, U1: Tephrite (ol < 10%) Basanite(ol > 10%), U2: Phonotephrite, U3: Tephriphonolite,\n' \ 'Ba: alkalic basalt,Bs: subalkalic baslt, S1: Trachybasalt, S2: Basaltic Trachyandesite, S3: Trachyandesite,\n' \ 'O1: Basaltic Andesite, O2: Andesite, O3 Dacite, T: Trachyte , Td: Trachydacite , R: Rhyolite, Q: Silexite \n' \ 'S/N/L: Sodalitite/Nephelinolith/Leucitolith' self.setWindowTitle(title) self.textbox.setText(self.reference+description) else: Labels = [u'F', u'Pc', u'U1', u'Ba', u'Bs', u'S1', u'U2', u'O1', u'S2', u'U3', u'O2', u'S3', u'Ph', u'O3', u'T', u'Td', u'R', u'Q', u'T/U/I'] title = 'TAS (total alkali–silica) diagram Plutonic (after Wilson et al. 1989).' description = '\n' \ 'F: Foidolite, Ph: Foid Syenite, Pc: Peridotgabbro, U1: Foid Gabbro, U2: Foid Monzodiorite, U3: Foid Monzosyenite,\n' \ 'Ba: alkalic gabbro,Bs: subalkalic gabbro, S1: Monzogabbro, S2: Monzodiorite, S3: Monzonite,\n' \ 'O1: Gabbroic Diorite, O2: Diorite, O3: Graodiorite, T: Syenite , Td: Quartz Monzonite , R: Granite, Q: Quartzolite \n' \ 'T/U/I: Tawite/Urtite/Italite' self.setWindowTitle(title) self.textbox.setText(self.reference+description) TagNumber = min(len(Labels), len(Locations)) if (self.tag_cb.isChecked()): for k in range(TagNumber): self.axes.annotate(Labels[k], Locations[k], xycoords='data', xytext=(X_offset, Y_offset), textcoords='offset points', fontsize=9, color='grey', alpha=0.8) self.DrawLine([(41, 0), (41, 3), (45, 3)]) self.DrawLine([(45, 0), (45, 3), (45, 5), (49.4, 7.3), (53, 9.3), (57.6, 11.7), (61, 13.5), (63, 16.2)], ) self.DrawLine([(52, 5), (57, 5.9), (63, 7), (69, 8), (71.8, 13.5), (61, 8.6)]) self.DrawLine([(45, 2), (45, 5), (52, 5), (45, 2)]) self.DrawLine( [(69, 8), (77.3, 0), (87.5, 4.7), (85.9, 6.8), (71.8, 13.5), (63, 16.2), (57, 18), (52.5, 18), (37, 14), (35, 9), (37, 3), (41, 3)]) self.DrawLine([(63, 0), (63, 7), (57.6, 11.7), (52.5, 14), (52.5, 18)]) self.DrawLine([(57, 0), (57, 5.9), (53, 9.3), (48.4, 11.5)]) self.DrawLine([(52, 0), (52, 5), (49.4, 7.3), (45, 9.4)]) self.DrawLine([(41, 3), (41, 7), (45, 9.4)]) self.DrawLine([(45, 9.4), (48.4, 11.5), (52.5, 14)]) # self.DrawLine([(41.75, 1), (52.5, 5)]) # self.DrawLine([(45.85, 2.75), (46.85, 3.0), (50.0, 4.0), (53.1, 5.0), (55.0, 5.8), (55.6, 6.0), (60.0, 6.8),(61.5, 7.0), (65.0, 7.35), (70.0, 7.85), (71.6, 8.0), (75.0, 8.3), (76.4, 8.4)]) # self.DrawLine([(45.85, 2.75), (46.85, 3.0), (50.0, 4.0), (53.1, 5.0), (55.0, 5.8), (55.6, 6.0), (60.0, 6.8),(61.5, 7.0), (65.0, 7.35), (70.0, 7.85), (71.6, 8.0), (75.0, 8.3), (76.4, 8.4)]) # self.DrawLine([(39.8, 0.35), (65.6, 9.7)]) # self.DrawLine([(39.2, 0.0), (40.0, 0.4), (43.2, 2.0), (45.0, 2.8), (48.0, 4.0), (50.0, 4.75), (53.7, 6.0),(55.0, 6.4), (60.0, 8.0), (65.0, 8.8)]) self.Check() if self.OutPutCheck==True: pass if (self._changed): df = self.CleanDataFile(self._df) for i in range(len(df)): TmpLabel = '' if (df.at[i, 'Label'] in PointLabels or df.at[i, 'Label'] == ''): TmpLabel = '' else: PointLabels.append(df.at[i, 'Label']) TmpLabel = df.at[i, 'Label'] TmpColor = '' if (df.at[i, 'Color'] in PointColors or df.at[i, 'Color'] == ''): TmpColor = '' else: PointColors.append(df.at[i, 'Color']) TmpColor = df.at[i, 'Color'] x.append(df.at[i, 'SiO2']) y.append(df.at[i, 'Na2O'] + df.at[i, 'K2O']) Size = df.at[i, 'Size'] Color = df.at[i, 'Color'] # print(Color, df.at[i, 'SiO2'], (df.at[i, 'Na2O'] + df.at[i, 'K2O'])) Alpha = df.at[i, 'Alpha'] Marker = df.at[i, 'Marker'] Label = df.at[i, 'Label'] xtest=df.at[i, 'SiO2'] ytest=df.at[i, 'Na2O'] + df.at[i, 'K2O'] for j in self.ItemNames: if self.SelectDic[j].contains_point([xtest,ytest]): self.LabelList.append(Label) self.TypeList.append(j) break pass self.axes.scatter(df.at[i, 'SiO2'], (df.at[i, 'Na2O'] + df.at[i, 'K2O']), marker=df.at[i, 'Marker'], s=df.at[i, 'Size'], color=df.at[i, 'Color'], alpha=df.at[i, 'Alpha'], label=TmpLabel, edgecolors='black') XtoFit = {} YtoFit = {} SVM_X=[] SVM_Y=[] for i in PointLabels: XtoFit[i]=[] YtoFit[i]=[] for i in range(len(df)): Alpha = df.at[i, 'Alpha'] Marker = df.at[i, 'Marker'] Label = df.at[i, 'Label'] xtest=df.at[i, 'SiO2'] ytest=df.at[i, 'Na2O'] + df.at[i, 'K2O'] XtoFit[Label].append(xtest) YtoFit[Label].append(ytest) SVM_X.append(xtest) SVM_Y.append(ytest) if (self.shape_cb.isChecked()): for i in PointLabels: if XtoFit[i] != YtoFit[i]: xmin, xmax = min(XtoFit[i]), max(XtoFit[i]) ymin, ymax = min(YtoFit[i]), max(YtoFit[i]) DensityColorMap = 'Greys' DensityAlpha = 0.1 DensityLineColor = PointColors[PointLabels.index(i)] DensityLineAlpha = 0.3 # Peform the kernel density estimate xx, yy = np.mgrid[xmin:xmax:200j, ymin:ymax:200j] # print(self.ShapeGroups) # command='''xx, yy = np.mgrid[xmin:xmax:'''+str(self.ShapeGroups)+ '''j, ymin:ymax:''' +str(self.ShapeGroups)+'''j]''' # exec(command) # print(xx, yy) positions = np.vstack([xx.ravel(), yy.ravel()]) values = np.vstack([XtoFit[i], YtoFit[i]]) kernelstatus = True try: st.gaussian_kde(values) except Exception as e: self.ErrorEvent(text=repr(e)) kernelstatus = False if kernelstatus == True: kernel = st.gaussian_kde(values) f = np.reshape(kernel(positions).T, xx.shape) # Contourf plot cfset = self.axes.contourf(xx, yy, f, cmap=DensityColorMap, alpha=DensityAlpha) ## Or kernel density estimate plot instead of the contourf plot # self.axes.imshow(np.rot90(f), cmap='Blues', extent=[xmin, xmax, ymin, ymax]) # Contour plot cset = self.axes.contour(xx, yy, f, colors=DensityLineColor, alpha=DensityLineAlpha) # Label plot #self.axes.clabel(cset, inline=1, fontsize=10) if (self.irvine_cb.isChecked()): self.axes.plot(XIrvine, YIrvine,color= 'black', linewidth=1, linestyle=':', alpha=0.6,label='Irvine, Barragar 1971\n') if (len(self.data_to_test) > 0): for i in range(len(self.data_to_test)): target = self.data_to_test.at[i, 'Label'] if target not in all_labels: all_labels.append(target) tmp_label = self.data_to_test.at[i, 'Label'] else: tmp_label='' x_load_test = self.data_to_test.at[i, 'SiO2'] y_load_test = self.data_to_test.at[i, 'Na2O'] + self.data_to_test.at[i, 'K2O'] for j in self.ItemNames: if self.SelectDic[j].contains_point([x_load_test, y_load_test]): self.LabelList.append(self.data_to_test.at[i, 'Label']) self.TypeList.append(j) break pass self.axes.scatter(self.data_to_test.at[i, 'SiO2'], (self.data_to_test.at[i, 'Na2O'] + self.data_to_test.at[i, 'K2O']), marker=self.data_to_test.at[i, 'Marker'], s=self.data_to_test.at[i, 'Size'], color=self.data_to_test.at[i, 'Color'], alpha=self.data_to_test.at[i, 'Alpha'], label=tmp_label, edgecolors='black') if (self.legend_cb.isChecked()): self.axes.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0, prop=fontprop) if (self.hyperplane_cb.isChecked()): clf = svm.SVC(C=1.0, kernel='linear') svm_x= SVM_X svm_y= SVM_Y print(len(svm_x),len(svm_y),len(df.index)) xx, yy = np.meshgrid(np.arange(min(svm_x), max(svm_x), np.ptp(svm_x) / 100), np.arange(min(svm_y), max(svm_y), np.ptp(svm_y) / 100)) le = LabelEncoder() le.fit(df.index) class_label = le.transform(df.index) svm_train= pd.concat([pd.DataFrame(svm_x),pd.DataFrame(svm_y)], axis=1) svm_train=svm_train.values clf.fit(svm_train,class_label) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) self.axes.contourf(xx, yy, Z, cmap='hot', alpha=0.2) self.canvas.draw() self.OutPutTitle='TAS' self.OutPutData = pd.DataFrame( {'Label': self.LabelList, 'RockType': self.TypeList }) self.OutPutFig=self.fig def Explain(self): #self.OutPutData = self.OutPutData.set_index('Label') self.tablepop = TabelViewer(df=self.OutPutData,title='TAS Result') self.tablepop.show()
def Explain(self): #self.OutPutData = self.OutPutData.set_index('Label') self.tablepop = TabelViewer(df=self.OutPutData,title='TAS Result') self.tablepop.show()
class TAS(AppForm): _df = pd.DataFrame() _changed = False xlabel = r'$SiO_2 wt\%$' ylabel = r'$Na_2O + K_2O wt\%$' itemstocheck = ['SiO2', 'K2O', 'Na2O'] reference = 'Reference: Maitre, R. W. L., Streckeisen, A., Zanettin, B., Bas, M. J. L., Bonin, B., and Bateman, P., 2004, Igneous Rocks: A Classification and Glossary of Terms: Cambridge University Press, v. -1, no. 70, p. 93–120.' ItemNames = ['Foidolite', 'Peridotgabbro', 'Foid Gabbro', 'Foid Monzodiorite', 'Foid Monzosyenite', 'Foid Syenite', 'Gabbro Bs', 'Gabbro Ba', 'Monzogabbro', 'Monzodiorite', 'Monzonite', 'Syenite', 'Quartz Monzonite', 'Gabbroic Diorite', 'Diorite', 'Granodiorite', 'Granite', 'Quartzolite', ] LocationAreas = [[[41, 3], [37, 3], [35, 9], [37, 14], [52.5, 18], [52.5, 14], [48.4, 11.5], [45, 9.4], [41, 7]], [[41, 0], [41, 3], [45, 3], [45, 0]], [[41, 3], [41, 7], [45, 9.4], [49.4, 7.3], [45, 5], [45, 3]], [[45, 9.4], [48.4, 11.5], [53, 9.3], [49.4, 7.3]], [[48.4, 11.5], [52.5, 14], [57.6, 11.7], [53, 9.3]], [[52.5, 14], [52.5, 18], [57, 18], [63, 16.2], [61, 13.5], [57.6, 11.7]], [[45, 0], [45, 2], [52, 5], [52, 0]], [[45, 2], [45, 5], [52, 5]], [[45, 5], [49.4, 7.3], [52, 5]], [[49.4, 7.3], [53, 9.3], [57, 5.9], [52, 5]], [[53, 9.3], [57.6, 11.7], [61, 8.6], [63, 7], [57, 5.9]], [[57.6, 11.7], [61, 13.5], [63, 16.2], [71.8, 13.5], [61, 8.6]], [[61, 8.6], [71.8, 13.5], [69, 8], [63, 7]], [[52, 0], [52, 5], [57, 5.9], [57, 0]], [[57, 0], [57, 5.9], [63, 7], [63, 0]], [[63, 0], [63, 7], [69, 8], [77.3, 0]], [[77.3, 0], [69, 8], [71.8, 13.5], [85.9, 6.8], [87.5, 4.7]], [[77.3, 0], [87.5, 4.7], [90, 4.7], [90, 0]], ] AreasHeadClosed = [] SelectDic = {} TypeList=[] def create_main_frame(self): self.resize(800, 600) self.main_frame = QWidget() self.dpi = 128 self.fig = Figure((18.0, 12.0), dpi=self.dpi) self.fig.subplots_adjust(hspace=0.5, wspace=0.5, left=0.1, bottom=0.2, right=0.7, top=0.9) self.canvas = FigureCanvas(self.fig) self.canvas.setParent(self.main_frame) self.axes = self.fig.add_subplot(111) self.axes.axis('off') # Create the navigation toolbar, tied to the canvas self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame) # Other GUI controls self.save_button = QPushButton('&Save') self.save_button.clicked.connect(self.saveImgFile) self.result_button = QPushButton('&Result') self.result_button.clicked.connect(self.Explain) self.legend_cb = QCheckBox('&Legend') self.legend_cb.setChecked(True) self.legend_cb.stateChanged.connect(self.TAS) # int self.irvine_cb = QCheckBox('&Irvine') self.irvine_cb.setChecked(True) self.irvine_cb.stateChanged.connect(self.TAS) # int self.tag_cb = QCheckBox('&Tag') self.tag_cb.setChecked(True) self.tag_cb.stateChanged.connect(self.TAS) # int self.slider_left_label = QLabel('Volcanic') self.slider_right_label = QLabel('Plutonic') self.slider = QSlider(Qt.Horizontal) self.slider.setRange(0, 1) self.slider.setValue(0) self.slider.setTracking(True) self.slider.setTickPosition(QSlider.TicksBothSides) self.slider.valueChanged.connect(self.TAS) # int # # Layout with box sizers # self.hbox = QHBoxLayout() for w in [self.save_button, self.result_button, self.legend_cb,self.tag_cb,self.irvine_cb, self.slider_left_label, self.slider,self.slider_right_label]: self.hbox.addWidget(w) self.hbox.setAlignment(w, Qt.AlignVCenter) self.vbox = QVBoxLayout() self.vbox.addWidget(self.mpl_toolbar) self.vbox.addWidget(self.canvas) self.vbox.addLayout(self.hbox) self.textbox = GrowingTextEdit(self) self.textbox.setText(self.reference) self.vbox.addWidget(self.textbox) self.main_frame.setLayout(self.vbox) self.setCentralWidget(self.main_frame) w=self.width() h=self.height() self.slider.setFixedWidth(w/10) def Irvine(self,x, a = 39.0, b = 3.9492, c = -2.1111, d = 0.86096, e = -0.15188, f = 0.012030, g = -(3.3539 / 10000)): return(a+ b*np.power(x,1) +c*np.power(x,2) +d*np.power(x,3) +e*np.power(x,4) +f*np.power(x,5) +g*np.power(x,6)) pass def TAS(self, Left=35, Right=79, X0=30, X1=90, X_Gap=7, Base=0, Top=19, Y0=1, Y1=19, Y_Gap=19, FontSize=12, xlabel=r'$SiO_2 wt\%$', ylabel=r'$Na_2O + K_2O wt\%$', width=12, height=12, dpi=300): self.setWindowTitle('TAS (total alkali–silica) diagram Volcanic/Plutonic (Wilson et al. 1989)') self.axes.clear() #self.axes.axis('off') self.axes.set_xlabel(self.xlabel) self.axes.set_ylabel(self.ylabel) self.axes.spines['right'].set_color('none') self.axes.spines['top'].set_color('none') self.axes.set_xticks([30,40,50,60,70,80,90]) self.axes.set_xticklabels([30,40,50,60,70,80,90]) self.axes.set_yticks([0, 5, 10, 15, 20]) self.axes.set_yticklabels([0, 5, 10, 15, 20]) self.axes.set_ylim(bottom=0) YIrvine= np.arange(0,10.2,0.1) XIrvine= self.Irvine(YIrvine) PointLabels = [] x = [] y = [] Locations = [(39, 10), (43, 1.5), (44, 6), (47.5, 3.5), (49.5, 1.5), (49, 5.2), (49, 9.5), (54, 3), (53, 7), (53, 12), (60, 4), (57, 8.5), (57, 14), (67, 5), (65, 12), (67, 9), (75, 9), (85, 1), (55, 18.5)] X_offset = -6 Y_offset = 3 if (int(self.slider.value())==0): Labels = [u'F', u'Pc', u'U1', u'Ba', u'Bs', u'S1', u'U2', u'O1', u'S2', u'U3', u'O2', u'S3', u'Ph', u'O3', u'T', u'Td', u'R', u'Q', u'S/N/L'] title = 'TAS (total alkali–silica) diagram Volcanic (after Wilson et al. 1989).' description = '\n' \ 'F: Foidite, Ph: Phonolite, Pc Pocrobasalt, U1: Tephrite (ol < 10%) Basanite(ol > 10%), U2: Phonotephrite, U3: Tephriphonolite,\n' \ 'Ba: alkalic basalt,Bs: subalkalic baslt, S1: Trachybasalt, S2: Basaltic Trachyandesite, S3: Trachyandesite,\n' \ 'O1: Basaltic Andesite, O2: Andesite, O3 Dacite, T: Trachyte , Td: Trachydacite , R: Rhyolite, Q: Silexite \n' \ 'S/N/L: Sodalitite/Nephelinolith/Leucitolith' self.setWindowTitle(title) self.textbox.setText(self.reference+description) else: Labels = [u'F', u'Pc', u'U1', u'Ba', u'Bs', u'S1', u'U2', u'O1', u'S2', u'U3', u'O2', u'S3', u'Ph', u'O3', u'T', u'Td', u'R', u'Q', u'T/U/I'] title = 'TAS (total alkali–silica) diagram Plutonic (after Wilson et al. 1989).' description = '\n' \ 'F: Foidolite, Ph: Foid Syenite, Pc: Peridotgabbro, U1: Foid Gabbro, U2: Foid Monzodiorite, U3: Foid Monzosyenite,\n' \ 'Ba: alkalic gabbro,Bs: subalkalic gabbro, S1: Monzogabbro, S2: Monzodiorite, S3: Monzonite,\n' \ 'O1: Gabbroic Diorite, O2: Diorite, O3: Graodiorite, T: Syenite , Td: Quartz Monzonite , R: Granite, Q: Quartzolite \n' \ 'T/U/I: Tawite/Urtite/Italite' self.setWindowTitle(title) self.textbox.setText(self.reference+description) TagNumber = min(len(Labels), len(Locations)) if (self.tag_cb.isChecked()): for k in range(TagNumber): self.axes.annotate(Labels[k], Locations[k], xycoords='data', xytext=(X_offset, Y_offset), textcoords='offset points', fontsize=9, color='grey', alpha=0.8) self.DrawLine([(41, 0), (41, 3), (45, 3)]) self.DrawLine([(45, 0), (45, 3), (45, 5), (49.4, 7.3), (53, 9.3), (57.6, 11.7), (61, 13.5), (63, 16.2)], ) self.DrawLine([(52, 5), (57, 5.9), (63, 7), (69, 8), (71.8, 13.5), (61, 8.6)]) self.DrawLine([(45, 2), (45, 5), (52, 5), (45, 2)]) self.DrawLine( [(69, 8), (77.3, 0), (87.5, 4.7), (85.9, 6.8), (71.8, 13.5), (63, 16.2), (57, 18), (52.5, 18), (37, 14), (35, 9), (37, 3), (41, 3)]) self.DrawLine([(63, 0), (63, 7), (57.6, 11.7), (52.5, 14), (52.5, 18)]) self.DrawLine([(57, 0), (57, 5.9), (53, 9.3), (48.4, 11.5)]) self.DrawLine([(52, 0), (52, 5), (49.4, 7.3), (45, 9.4)]) self.DrawLine([(41, 3), (41, 7), (45, 9.4)]) self.DrawLine([(45, 9.4), (48.4, 11.5), (52.5, 14)]) # self.DrawLine([(41.75, 1), (52.5, 5)]) # self.DrawLine([(45.85, 2.75), (46.85, 3.0), (50.0, 4.0), (53.1, 5.0), (55.0, 5.8), (55.6, 6.0), (60.0, 6.8),(61.5, 7.0), (65.0, 7.35), (70.0, 7.85), (71.6, 8.0), (75.0, 8.3), (76.4, 8.4)]) # self.DrawLine([(39.8, 0.35), (65.6, 9.7)]) # self.DrawLine([(39.2, 0.0), (40.0, 0.4), (43.2, 2.0), (45.0, 2.8), (48.0, 4.0), (50.0, 4.75), (53.7, 6.0),(55.0, 6.4), (60.0, 8.0), (65.0, 8.8)]) self.Check() if self.OutPutCheck==True: pass if (self._changed): df = self._df for i in range(len(df)): TmpLabel = '' if (df.at[i, 'Label'] in PointLabels or df.at[i, 'Label'] == ''): TmpLabel = '' else: PointLabels.append(df.at[i, 'Label']) TmpLabel = df.at[i, 'Label'] x.append(df.at[i, 'SiO2']) y.append(df.at[i, 'Na2O'] + df.at[i, 'K2O']) Size = df.at[i, 'Size'] Color = df.at[i, 'Color'] # print(Color, df.at[i, 'SiO2'], (df.at[i, 'Na2O'] + df.at[i, 'K2O'])) Alpha = df.at[i, 'Alpha'] Marker = df.at[i, 'Marker'] Label = df.at[i, 'Label'] xtest=df.at[i, 'SiO2'] ytest=df.at[i, 'Na2O'] + df.at[i, 'K2O'] for j in self.ItemNames: if self.SelectDic[j].contains_point([xtest,ytest]): self.LabelList.append(Label) self.TypeList.append(j) break pass self.axes.scatter(df.at[i, 'SiO2'], (df.at[i, 'Na2O'] + df.at[i, 'K2O']), marker=df.at[i, 'Marker'], s=df.at[i, 'Size'], color=df.at[i, 'Color'], alpha=df.at[i, 'Alpha'], label=TmpLabel, edgecolors='black') if (self.irvine_cb.isChecked()): self.axes.plot(XIrvine, YIrvine,color= 'black', linewidth=1, linestyle=':', alpha=0.6,label='Irvine, Barragar 1971\n') if (self.legend_cb.isChecked()): self.axes.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0, prop=fontprop) self.canvas.draw() self.OutPutTitle='TAS' self.OutPutData = pd.DataFrame( {'Label': self.LabelList, 'RockType': self.TypeList }) self.OutPutFig=self.fig def Explain(self): #self.OutPutData = self.OutPutData.set_index('Label') self.tablepop = TabelViewer(df=self.OutPutData,title='TAS Result') self.tablepop.show()
class XY(AppForm): Element = [u'Cs', u'Tl', u'Rb', u'Ba', u'W', u'Th', u'U', u'Nb', u'Ta', u'K', u'La', u'Ce', u'Pb', u'Pr', u'Mo', u'Sr', u'P', u'Nd', u'F', u'Sm', u'Zr', u'Hf', u'Eu', u'Sn', u'Sb', u'Ti', u'Gd', u'Tb', u'Dy', u'Li', u'Y', u'Ho', u'Er', u'Tm', u'Yb', u'Lu'] StandardsName = ['OIB', 'EMORB', 'C1', 'PM', 'NMORB'] reference = 'Reference: Sun, S. S., and Mcdonough, W. F., 1989, Chemical and isotopic systematics of oceanic basalts: implications for mantle composition and processes: Geological Society London Special Publications, v. 42, no. 1, p. 313-345.' sentence ='' ContainNan = False NameChosen = 'OIB' Standards = { 'OIB': {'Cs': 0.387, 'Tl': 0.077, 'Rb': 31, 'Ba': 350, 'W': 0.56, 'Th': 4, 'U': 1.02, 'Nb': 48, 'Ta': 2.7, 'K': 12000, 'La': 37, 'Ce': 80, 'Pb': 3.2, 'Pr': 9.7, 'Mo': 2.4, 'Sr': 660, 'P': 2700, 'Nd': 38.5, 'F': 1150, 'Sm': 10, 'Zr': 280, 'Hf': 7.8, 'Eu': 3, 'Sn': 2.7, 'Sb': 0.03, 'Ti': 17200, 'Gd': 7.62, 'Tb': 1.05, 'Dy': 5.6, 'Li': 5.6, 'Y': 29, 'Ho': 1.06, 'Er': 2.62, 'Tm': 0.35, 'Yb': 2.16, 'Lu': 0.3}, 'EMORB': {'Cs': 0.063, 'Tl': 0.013, 'Rb': 5.04, 'Ba': 57, 'W': 0.092, 'Th': 0.6, 'U': 0.18, 'Nb': 8.3, 'Ta': 0.47, 'K': 2100, 'La': 6.3, 'Ce': 15, 'Pb': 0.6, 'Pr': 2.05, 'Mo': 0.47, 'Sr': 155, 'P': 620, 'Nd': 9, 'F': 250, 'Sm': 2.6, 'Zr': 73, 'Hf': 2.03, 'Eu': 0.91, 'Sn': 0.8, 'Sb': 0.01, 'Ti': 6000, 'Gd': 2.97, 'Tb': 0.53, 'Dy': 3.55, 'Li': 3.5, 'Y': 22, 'Ho': 0.79, 'Er': 2.31, 'Tm': 0.356, 'Yb': 2.37, 'Lu': 0.354}, 'C1': {'Cs': 0.188, 'Tl': 0.14, 'Rb': 2.32, 'Ba': 2.41, 'W': 0.095, 'Th': 0.029, 'U': 0.008, 'Nb': 0.246, 'Ta': 0.014, 'K': 545, 'La': 0.237, 'Ce': 0.612, 'Pb': 2.47, 'Pr': 0.095, 'Mo': 0.92, 'Sr': 7.26, 'P': 1220, 'Nd': 0.467, 'F': 60.7, 'Sm': 0.153, 'Zr': 3.87, 'Hf': 0.1066, 'Eu': 0.058, 'Sn': 1.72, 'Sb': 0.16, 'Ti': 445, 'Gd': 0.2055, 'Tb': 0.0374, 'Dy': 0.254, 'Li': 1.57, 'Y': 1.57, 'Ho': 0.0566, 'Er': 0.1655, 'Tm': 0.0255, 'Yb': 0.17, 'Lu': 0.0254}, 'PM': {'Cs': 0.032, 'Tl': 0.005, 'Rb': 0.635, 'Ba': 6.989, 'W': 0.02, 'Th': 0.085, 'U': 0.021, 'Nb': 0.713, 'Ta': 0.041, 'K': 250, 'La': 0.687, 'Ce': 1.775, 'Pb': 0.185, 'Pr': 0.276, 'Mo': 0.063, 'Sr': 21.1, 'P': 95, 'Nd': 1.354, 'F': 26, 'Sm': 0.444, 'Zr': 11.2, 'Hf': 0.309, 'Eu': 0.168, 'Sn': 0.17, 'Sb': 0.005, 'Ti': 1300, 'Gd': 0.596, 'Tb': 0.108, 'Dy': 0.737, 'Li': 1.6, 'Y': 4.55, 'Ho': 0.164, 'Er': 0.48, 'Tm': 0.074, 'Yb': 0.493, 'Lu': 0.074}, 'NMORB': {'Cs': 0.007, 'Tl': 0.0014, 'Rb': 0.56, 'Ba': 6.3, 'W': 0.01, 'Th': 0.12, 'U': 0.047, 'Nb': 2.33, 'Ta': 0.132, 'K': 600, 'La': 2.5, 'Ce': 7.5, 'Pb': 0.3, 'Pr': 1.32, 'Mo': 0.31, 'Sr': 90, 'P': 510, 'Nd': 7.3, 'F': 210, 'Sm': 2.63, 'Zr': 74, 'Hf': 2.05, 'Eu': 1.02, 'Sn': 1.1, 'Sb': 0.01, 'Ti': 7600, 'Gd': 3.68, 'Tb': 0.67, 'Dy': 4.55, 'Li': 4.3, 'Y': 28, 'Ho': 1.01, 'Er': 2.97, 'Tm': 0.456, 'Yb': 3.05, 'Lu': 0.455}, } Lines = [] Tags = [] xlabel = 'x' ylabel = 'y' description = 'X-Y Diagram' unuseful = ['Name', 'Mineral', 'Author', 'DataType', 'Label', 'Marker', 'Color', 'Size', 'Alpha', 'Style', 'Width', 'Tag'] width_plot = 100.0 height_plot = 100.0 width_load = width_plot height_load = height_plot polygon = [] polyline = [] line = [] strgons = [] strlines = [] strpolylines = [] extent = 0 Left = 0 Right = 0 Up = 0 Down = 0 FitLevel=1 FadeGroups=100 ShapeGroups=200 LabelSetted = False ValueChoosed = True FlagLoaded=False TypeLoaded='' def __init__(self, parent=None, df=pd.DataFrame(),Standard={}): QMainWindow.__init__(self, parent) self.setWindowTitle(self.description) self.items = [] self._df = df self._given_Standard = Standard if (len(df) > 0): self._changed = True # print('DataFrame recieved to Magic') self.raw = df self.rawitems = self.raw.columns.values.tolist() dataframe = self._df ItemsAvalibale = self._df.columns.values.tolist() ItemsToTest = ['Number', 'Tag', 'Name', 'Author', 'DataType', 'Marker', 'Color', 'Size', 'Alpha', 'Style', 'Width','Label'] for i in ItemsToTest: if i in ItemsAvalibale: dataframe = dataframe.drop(i, 1) dataframe_values_only = dataframe.apply(pd.to_numeric, errors='coerce') dataframe_values_only = dataframe_values_only.dropna(axis='columns') ItemsAvalibale = dataframe_values_only.columns.values.tolist() data_columns= ItemsAvalibale df= dataframe_values_only numdf = (df.drop(data_columns, axis=1).join(df[data_columns].apply(pd.to_numeric, errors='coerce'))) numdf = numdf[numdf[data_columns].notnull().all(axis=1)] ItemsAvalibale = numdf.columns.values.tolist() dataframe_values_only=numdf self.items = dataframe_values_only.columns.values.tolist() #print(self.items) self.create_main_frame() self.create_status_bar() self.polygon = 0 self.polyline = 0 self.flag = 0 def create_main_frame(self): self.resize(800, 800) self.main_frame = QWidget() self.dpi = 128 self.fig = Figure((8.0, 8.0), dpi=self.dpi) self.fig.subplots_adjust(hspace=0.5, wspace=0.5, left=0.3, bottom=0.3, right=0.7, top=0.9) self.canvas = FigureCanvas(self.fig) self.canvas.setParent(self.main_frame) self.axes = self.fig.add_subplot(111) # self.axes.hold(False) # Create the navigation toolbar, tied to the canvas self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame) # Other GUI controls self.save_button = QPushButton('&Save') self.save_button.clicked.connect(self.saveImgFile) self.stat_button = QPushButton('&Stat') self.stat_button.clicked.connect(self.Stat) self.load_button = QPushButton('&Load Basemap') self.load_button.clicked.connect(self.Load) self.unload_button = QPushButton('&Unload Basemap') self.unload_button.clicked.connect(self.Unload) self.legend_cb = QCheckBox('&Legend') self.legend_cb.setChecked(True) self.legend_cb.stateChanged.connect(self.Magic) # int self.fit_cb= QCheckBox('&PolyFit') self.fit_cb.setChecked(False) self.fit_cb.stateChanged.connect(self.Magic) # int self.fit_seter = QLineEdit(self) self.fit_seter.textChanged[str].connect(self.FitChanged) self.fit_slider_label = QLabel('y= f(x) EXP') self.fit_slider = QSlider(Qt.Vertical) self.fit_slider.setRange(0, 1) self.fit_slider.setValue(0) self.fit_slider.setTracking(True) self.fit_slider.setTickPosition(QSlider.TicksBothSides) self.fit_slider.valueChanged.connect(self.Magic) # int self.shape_cb= QCheckBox('&Shape') self.shape_cb.setChecked(False) self.shape_cb.stateChanged.connect(self.Magic) # int #self.shape_label = QLabel('Step') #self.shape_seter = QLineEdit(self) #self.shape_seter.textChanged[str].connect(self.ShapeChanged) self.norm_cb = QCheckBox('&Norm') self.norm_cb.setChecked(False) self.norm_cb.stateChanged.connect(self.Magic) # int self.standard_slider = QSlider(Qt.Horizontal) self.standard_slider.setRange(0, len(self.StandardsName)) if len(self._given_Standard) > 0: self.standard_slider.setValue(len(self.StandardsName)) self.right_label = QLabel("Self Defined Standard") else: self.standard_slider.setValue(0) self.right_label = QLabel(self.StandardsName[int(self.standard_slider.value())]) self.standard_slider.setTracking(True) self.standard_slider.setTickPosition(QSlider.TicksBothSides) self.standard_slider.valueChanged.connect(self.Magic) # int self.left_label= QLabel('Standard' ) self.x_element = QSlider(Qt.Horizontal) self.x_element.setRange(0, len(self.items) - 1) self.x_element.setValue(0) self.x_element.setTracking(True) self.x_element.setTickPosition(QSlider.TicksBothSides) self.x_element.valueChanged.connect(self.ValueChooser) # int self.x_seter = QLineEdit(self) self.x_seter.textChanged[str].connect(self.LabelSeter) #self.x_calculator = QLineEdit(self) self.logx_cb = QCheckBox('&Log') self.logx_cb.setChecked(False) self.logx_cb.stateChanged.connect(self.Magic) # int self.y_element = QSlider(Qt.Horizontal) self.y_element.setRange(0, len(self.items) - 1) self.y_element.setValue(1) self.y_element.setTracking(True) self.y_element.setTickPosition(QSlider.TicksBothSides) self.y_element.valueChanged.connect(self.ValueChooser) # int self.y_seter = QLineEdit(self) self.y_seter.textChanged[str].connect(self.LabelSeter) #self.y_calculator = QLineEdit(self) self.logy_cb = QCheckBox('&Log') self.logy_cb.setChecked(False) self.logy_cb.stateChanged.connect(self.Magic) # int self.width_size_seter_label = QLabel('SVG Width') self.width_size_seter = QLineEdit(self) self.width_size_seter.textChanged[str].connect(self.WChanged) self.height_size_seter_label = QLabel('SVG Height') self.height_size_seter = QLineEdit(self) self.height_size_seter.textChanged[str].connect(self.HChanged) self.Left_size_seter_label = QLabel('PNG Left') self.Left_size_seter = QLineEdit(self) self.Left_size_seter.textChanged[str].connect(self.LeftChanged) self.Right_size_seter_label = QLabel('PNG Right') self.Right_size_seter = QLineEdit(self) self.Right_size_seter.textChanged[str].connect(self.RightChanged) self.Up_size_seter_label = QLabel('PNG Top') self.Up_size_seter = QLineEdit(self) self.Up_size_seter.textChanged[str].connect(self.UpChanged) self.Down_size_seter_label = QLabel('PNG Bottom') self.Down_size_seter = QLineEdit(self) self.Down_size_seter.textChanged[str].connect(self.DownChanged) # # Layout with box sizers # self.hbox0 = QHBoxLayout() self.hbox1 = QHBoxLayout() self.hbox2 = QHBoxLayout() self.hbox3 = QHBoxLayout() self.hbox4 = QHBoxLayout() for w in [self.save_button,self.stat_button,self.legend_cb,self.norm_cb, self.left_label, self.standard_slider,self.right_label,self.shape_cb,self.fit_cb,self.fit_slider,self.fit_slider_label ,self.fit_seter]: self.hbox0.addWidget(w) self.hbox0.setAlignment(w, Qt.AlignVCenter) for w in [self.logx_cb,self.x_seter, self.x_element]: self.hbox1.addWidget(w) self.hbox1.setAlignment(w, Qt.AlignVCenter) for w in [self.logy_cb,self.y_seter, self.y_element]: self.hbox2.addWidget(w) self.hbox2.setAlignment(w, Qt.AlignVCenter) for w in [self.load_button, self.width_size_seter_label, self.width_size_seter, self.height_size_seter_label, self.height_size_seter]: self.hbox3.addWidget(w) self.hbox3.setAlignment(w, Qt.AlignLeft) for w in [self.unload_button,self.Left_size_seter_label, self.Left_size_seter, self.Right_size_seter_label, self.Right_size_seter,self.Down_size_seter_label, self.Down_size_seter, self.Up_size_seter_label ,self.Up_size_seter]: self.hbox4.addWidget(w) self.hbox4.setAlignment(w, Qt.AlignLeft) self.vbox = QVBoxLayout() self.vbox.addWidget(self.mpl_toolbar) self.vbox.addWidget(self.canvas) self.vbox.addLayout(self.hbox0) self.vbox.addLayout(self.hbox1) self.vbox.addLayout(self.hbox2) self.vbox.addLayout(self.hbox3) self.vbox.addLayout(self.hbox4) self.textbox = GrowingTextEdit(self) self.vbox.addWidget(self.textbox) self.main_frame.setLayout(self.vbox) self.setCentralWidget(self.main_frame) w=self.width() h=self.height() self.x_seter.setFixedWidth(w/10) self.y_seter.setFixedWidth(w/10) self.save_button.setFixedWidth(w/10) self.stat_button.setFixedWidth(w/10) self.standard_slider.setFixedWidth(w/5) self.right_label.setFixedWidth(w/5) self.fit_seter.setFixedWidth(w/20) self.load_button.setFixedWidth(w/5) self.unload_button.setFixedWidth(w/5) self.width_size_seter_label.setFixedWidth(w/10) self.height_size_seter_label.setFixedWidth(w/10) self.width_size_seter.setMinimumWidth(w/20) self.height_size_seter.setMinimumWidth(w/20) self.Right_size_seter_label.setFixedWidth(w/10) self.Left_size_seter_label.setFixedWidth(w/10) self.Up_size_seter_label.setFixedWidth(w/10) self.Down_size_seter_label.setFixedWidth(w/10) self.Right_size_seter.setFixedWidth(w/20) self.Left_size_seter.setFixedWidth(w/20) self.Up_size_seter.setFixedWidth(w/20) self.Down_size_seter.setFixedWidth(w/20) def Read(self, inpoints): points = [] for i in inpoints: points.append(i.split()) result = [] for i in points: for l in range(len(i)): a = float((i[l].split(','))[0]) a = a * self.x_scale b = float((i[l].split(','))[1]) b = (self.height_load - b) * self.y_scale result.append((a, b)) return (result) def Load(self): fileName, filetype = QFileDialog.getOpenFileName(self, '选取文件', '~/', 'PNG Files (*.png);;JPG Files (*.jpg);;SVG Files (*.svg)') # 设置文件扩展名过滤,注意用双分号间隔 #print(fileName, '\t', filetype) if len(fileName)>0: self.FlagLoaded= True if ('svg' in fileName): self.TypeLoaded='svg' doc = minidom.parse(fileName) # parseString also exists polygon_points = [path.getAttribute('points') for path in doc.getElementsByTagName('polygon')] polyline_points = [path.getAttribute('points') for path in doc.getElementsByTagName('polyline')] svg_width = [path.getAttribute('width') for path in doc.getElementsByTagName('svg')] svg_height = [path.getAttribute('height') for path in doc.getElementsByTagName('svg')] # print(svg_width) # print(svg_height) digit = '01234567890.-' width = svg_width[0].replace('px', '').replace('pt', '') height = svg_height[0].replace('px', '').replace('pt', '') self.width_load = float(width) self.height_load = float(height) soup = BeautifulSoup(open(fileName), 'lxml') tmpgon = soup.find_all('polygon') tmppolyline = soup.find_all('polyline') tmptext = soup.find_all('text') tmpline = soup.find_all('line') tmppath = soup.find_all('path') self.strgons = [] for i in tmpgon: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.polygon.attrs self.strgons.append(k['points'].split()) self.strpolylines = [] for i in tmppolyline: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.polyline.attrs self.strpolylines.append(k['points'].split()) self.strlines = [] for i in tmpline: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.line.attrs a = str(k['x1']) + ',' + str(k['y1']) + ' ' + str(k['x2']) + ',' + str(k['y2']) self.strlines.append(a.split()) self.strpath = [] for i in tmppath: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.path.attrs self.strpath.append(k['d'].split()) # print(self.strpath) self.polygon = [] for i in self.strgons: m = self.Read(i) m.append(m[0]) self.polygon.append(m) self.polyline = [] for i in self.strpolylines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.polyline.append(m) self.line = [] for i in self.strlines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.line.append(m) elif ('png' in fileName or 'jpg' in fileName): self.TypeLoaded='png' self.img = mpimg.imread(fileName) self.flag = 1 self.Magic() def Unload(self): self.flag = 0 self.FlagLoaded = False self.TypeLoaded = '' self.Magic() def WChanged(self, text): try: self.width_plot = float(text) except Exception as e: self.ErrorEvent(text=repr(e)) self.x_scale = self.width_plot / self.width_load self.polygon = [] for i in self.strgons: m = self.Read(i) m.append(m[0]) self.polygon.append(m) self.polyline = [] for i in self.strpolylines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.polyline.append(m) self.line = [] for i in self.strlines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.line.append(m) self.Magic() def HChanged(self, text): try: self.height_plot = float(text) except Exception as e: self.ErrorEvent(text=repr(e)) self.y_scale = self.height_plot / self.height_load self.polygon = [] for i in self.strgons: m = self.Read(i) m.append(m[0]) self.polygon.append(m) self.polyline = [] for i in self.strpolylines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.polyline.append(m) self.line = [] for i in self.strlines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.line.append(m) self.Magic() # text_location= [path.getAttribute('transform') for path in doc.getElementsByTagName('text')] ''' tmppolygon_points=[] for i in polygon_points: tmppolygon_points.append(i.split()) polygon=[] for i in tmppolygon_points: for l in range(len(i)): a=float((i[l].split(','))[0]) b=float((i[l].split(','))[1]) polygon.append([a,b]) ''' def LeftChanged(self, text): try: self.Left = float(text) except Exception as e: self.ErrorEvent(text=repr(e)) self.Magic() def RightChanged(self, text): try: self.Right = float(text) except Exception as e: self.ErrorEvent(text=repr(e)) self.Magic() def UpChanged(self, text): try: self.Up = float(text) except Exception as e: self.ErrorEvent(text=repr(e)) self.Magic() def DownChanged(self, text): try: self.Down = float(text) except Exception as e: self.ErrorEvent(text=repr(e)) self.Magic() def FitChanged(self, text): try: self.FitLevel = float(text) except Exception as e: self.ErrorEvent(text=repr(e)) self.Magic() def ShapeChanged(self, text): w = 'Shape' + text self.shape_label.setText(w) self.shape_label.adjustSize() try: self.ShapeGroups = int(text) except Exception as e: self.ErrorEvent(text=repr(e)) self.Magic() def LabelSeter(self): self.LabelSetted = True self.ValueChoosed = False self.Magic() def ValueChooser(self): self.LabelSetted = False self.ValueChoosed = True self.Magic() def Magic(self): self.WholeData = [] self.x_scale = self.width_plot / self.width_load self.y_scale = self.height_plot / self.height_load # print(self.x_scale,' and ',self.x_scale) raw = self._df dataframe = self._df ItemsAvalibale = self._df.columns.values.tolist() ItemsToTest = ['Number', 'Tag', 'Name', 'Author', 'DataType', 'Marker', 'Color', 'Size', 'Alpha', 'Style', 'Width','Label'] for i in ItemsToTest: if i in ItemsAvalibale: dataframe = dataframe.drop(i, 1) dataframe_values_only = dataframe.apply(pd.to_numeric, errors='coerce') dataframe_values_only = dataframe_values_only.dropna(axis='columns') ItemsAvalibale = dataframe_values_only.columns.values.tolist() data_columns= ItemsAvalibale df= dataframe_values_only numdf = (df.drop(data_columns, axis=1).join(df[data_columns].apply(pd.to_numeric, errors='coerce'))) numdf = numdf[numdf[data_columns].notnull().all(axis=1)] ItemsAvalibale = numdf.columns.values.tolist() dataframe_values_only=numdf a = int(self.x_element.value()) b = int(self.y_element.value()) if self.LabelSetted == True: if(self.x_seter.text()!=''): try: a = int(self.x_seter.text()) except(ValueError): atmp=self.x_seter.text() try: if atmp in ItemsAvalibale: a= ItemsAvalibale.index(atmp) #print(a) except Exception as e: self.ErrorEvent(text=repr(e)) pass pass self.x_element.setValue(a) else: a = int(self.x_element.value()) if (self.y_seter.text() != ''): try: b = int(self.y_seter.text()) except(ValueError): btmp=self.y_seter.text() try: if btmp in ItemsAvalibale: b= ItemsAvalibale.index(btmp) #print(b) except Exception as e: self.ErrorEvent(text=repr(e)) pass pass self.y_element.setValue(b) else: b = int(self.y_element.value()) if b> len(ItemsAvalibale)-1: b = int(self.y_element.value()) if a> len(ItemsAvalibale)-1: a = int(self.x_element.value()) if self.ValueChoosed == True: a = int(self.x_element.value()) b = int(self.y_element.value()) self.x_seter.setText(ItemsAvalibale[a]) self.y_seter.setText(ItemsAvalibale[b]) self.axes.clear() if (self.Left != self.Right) and (self.Down != self.Up) and abs(self.Left) + abs(self.Right) + abs( self.Down) + abs(self.Up) != 0: self.extent = [self.Left, self.Right, self.Down, self.Up] elif (self.Left == self.Right and abs(self.Left) + abs(self.Right) != 0): reply = QMessageBox.warning(self, 'Warning', 'You set same value to Left and Right limits.') self.extent = 0 elif (self.Down == self.Up and abs(self.Down) + abs(self.Up) != 0): reply = QMessageBox.warning(self, 'Warning', 'You set same value to Up and Down limits.') self.extent = 0 else: self.extent = 0 slider_value=int(self.standard_slider.value()) if slider_value < len(self.StandardsName): standardnamechosen = self.StandardsName[slider_value] standardchosen = self.Standards[standardnamechosen] right_label_text=self.StandardsName[slider_value] elif len(self._given_Standard)<=0: standardnamechosen = self.StandardsName[slider_value-1] standardchosen = self.Standards[standardnamechosen] right_label_text = self.StandardsName[slider_value-1] else: standardnamechosen = "Self Defined Standard" standardchosen = self._given_Standard right_label_text = "Self Defined Standard" self.right_label.setText(right_label_text) if self.flag != 0: if self.extent != 0: self.axes.imshow(self.img, interpolation='nearest', aspect='auto', extent=self.extent) else: self.axes.imshow(self.img, interpolation='nearest', aspect='auto') self.axes.set_xlabel(ItemsAvalibale[a]) self.axes.set_ylabel(ItemsAvalibale[b]) PointLabels = [] XtoFit = [] YtoFit = [] for i in range(len(raw)): # raw.at[i, 'DataType'] == 'User' or raw.at[i, 'DataType'] == 'user' or raw.at[i, 'DataType'] == 'USER' TmpLabel = '' # self.WholeData.append(math.log(tmp, 10)) if (raw.at[i, 'Label'] in PointLabels or raw.at[i, 'Label'] == ''): TmpLabel = '' else: PointLabels.append(raw.at[i, 'Label']) TmpLabel = raw.at[i, 'Label'] x, y = raw.at[i, self.items[a]], raw.at[i, self.items[b]] try: xuse = x yuse = y self.xlabel = self.items[a] self.ylabel = self.items[b] if (self.norm_cb.isChecked()): self.sentence = self.reference #print(self.items[a] , self.items[a] in self.Element) item_a =self.items[a] item_b =self.items[b] str_to_check=['ppm','(',')','[',']','wt','\%'] for j in str_to_check: if j in item_a: item_a=item_a.replace(j, "") if j in item_b: item_b=item_b.replace(j, "") if item_a in self.Element: self.xlabel = self.items[a] + ' Norm by ' + standardnamechosen xuse = xuse / standardchosen[item_a] if item_b in self.Element: self.ylabel = self.items[b] + ' Norm by ' + standardnamechosen yuse = yuse / standardchosen[item_b] if (self.logx_cb.isChecked()): xuse = math.log(x, 10) newxlabel = '$log10$( ' + self.xlabel + ')' self.axes.set_xlabel(newxlabel) else: self.axes.set_xlabel(self.xlabel) if (self.logy_cb.isChecked()): yuse = math.log(y, 10) newylabel = '$log10$( ' + self.ylabel + ')' self.axes.set_ylabel(newylabel) else: self.axes.set_ylabel(self.ylabel) self.axes.scatter(xuse, yuse, marker=raw.at[i, 'Marker'], s=raw.at[i, 'Size'], color=raw.at[i, 'Color'], alpha=raw.at[i, 'Alpha'], label=TmpLabel, edgecolors='black') XtoFit.append(xuse) YtoFit.append(yuse) except Exception as e: self.ErrorEvent(text=repr(e)) #pass #Yline = np.linspace(min(YtoFit), max(YtoFit), 30) ResultStr='' BoxResultStr='' Paralist=[] #print(XtoFit, '\n', YtoFit) if len(XtoFit) != len(YtoFit): reply = QMessageBox.information(self, 'Warning','Your Data X and Y have different length!') pass fitstatus = True if (int(self.fit_slider.value()) == 0): if len(XtoFit)>0: Xline = np.linspace(min(XtoFit), max(XtoFit), 30) try: np.polyfit(XtoFit, YtoFit, self.FitLevel) except Exception as e: self.ErrorEvent(text=repr(e)) fitstatus = False if (fitstatus == True): try: opt, cov = np.polyfit(XtoFit, YtoFit, self.FitLevel, cov=True) self.fit_slider_label.setText('y= f(x) EXP') p = np.poly1d(opt) Yline = p(Xline) formular = 'y= f(x):' sigma = np.sqrt(np.diag(cov)) N = len(XtoFit) F = N - 2 MSWD = 1 + 2 * np.sqrt(2 / F) MSWDerr = np.sqrt(2 / F) for i in range(int(self.FitLevel + 1)): Paralist.append([opt[i], sigma[i]]) if int(self.fit_slider.value()) == 0: if (self.FitLevel - i == 0): ResultStr = ResultStr + str(opt[i]) + '$\pm$' + str(sigma[i]) + '+' BoxResultStr = BoxResultStr + str(opt[i]) + '±' + str(sigma[i]) + '\n' else: ResultStr = ResultStr + str(opt[i]) + '$\pm$' + str(sigma[i]) + '$x^' + str( self.FitLevel - i) + '$' + '+' BoxResultStr = BoxResultStr + str(opt[i]) + '±' + str(sigma[i]) + 'x^' + str( self.FitLevel - i) + '+\n' elif (int(self.fit_slider.value()) == 1): if (self.FitLevel - i == 0): ResultStr = ResultStr + str(opt[i]) + '$\pm$' + str(sigma[i]) + '+' BoxResultStr = BoxResultStr + str(opt[i]) + '±' + str(sigma[i]) + '+\n' else: ResultStr = ResultStr + str(opt[i]) + '$\pm$' + str(sigma[i]) + '$y^' + str( self.FitLevel - i) + '$' + '+' BoxResultStr = BoxResultStr + str(opt[i]) + '±' + str(sigma[i]) + 'y^' + str( self.FitLevel - i) + '+\n' pass pass self.textbox.setText(formular + '\n' + BoxResultStr + '\n MSWD(±2σ)' + str(MSWD) + '±' + str( 2 * MSWDerr) + '\n' + self.sentence) if (self.fit_cb.isChecked()): self.axes.plot(Xline, Yline, 'b-') except Exception as e: self.ErrorEvent(text=repr(e)) elif (int(self.fit_slider.value()) == 1): if len(YtoFit) > 0: Yline = np.linspace(min(YtoFit), max(YtoFit), 30) try: np.polyfit(YtoFit, XtoFit, self.FitLevel, cov=True) except(ValueError, TypeError): fitstatus = False pass if (fitstatus == True): opt, cov = np.polyfit(YtoFit, XtoFit, self.FitLevel, cov=True) self.fit_slider_label.setText('x= f(x) EXP') p = np.poly1d(opt) Xline = p(Yline) formular = 'x= f(y):' sigma = np.sqrt(np.diag(cov)) N=len(XtoFit) F=N-2 MSWD=1+2*np.sqrt(2/F) MSWDerr=np.sqrt(2/F) for i in range(int(self.FitLevel + 1)): Paralist.append([opt[i], sigma[i]]) if int(self.fit_slider.value()) == 0: if (self.FitLevel - i == 0): ResultStr = ResultStr + str(opt[i]) + '$\pm$' + str(sigma[i])+'+' BoxResultStr = BoxResultStr + str(opt[i]) + '±' + str(sigma[i]) + '\n' else: ResultStr = ResultStr+ str(opt[i])+'$\pm$'+str(sigma[i])+'$x^'+str(self.FitLevel-i)+'$'+'+' BoxResultStr = BoxResultStr + str(opt[i]) + '±' + str(sigma[i]) + 'x^' + str( self.FitLevel - i) + '+\n' elif (int(self.fit_slider.value()) == 1): if (self.FitLevel-i==0): ResultStr = ResultStr + str(opt[i]) + '$\pm$' + str(sigma[i])+'+' BoxResultStr = BoxResultStr + str(opt[i]) + '±' + str(sigma[i]) + '+\n' else: ResultStr = ResultStr+ str(opt[i])+'$\pm$'+str(sigma[i])+'$y^'+str(self.FitLevel-i)+'$'+'+' BoxResultStr = BoxResultStr + str(opt[i]) + '±' + str(sigma[i]) + 'y^' + str( self.FitLevel - i) + '+\n' pass pass self.textbox.setText(formular +'\n'+ BoxResultStr+ '\n MSWD(±2σ)'+str(MSWD)+'±'+str(2*MSWDerr)+'\n' + self.sentence) if (self.fit_cb.isChecked()): self.axes.plot(Xline, Yline, 'b-') if (self.shape_cb.isChecked()): if XtoFit != YtoFit: xmin, xmax = min(XtoFit), max(XtoFit) ymin, ymax = min(YtoFit), max(YtoFit) DensityColorMap = 'Blues' DensityAlpha = 0.3 DensityLineColor = 'grey' DensityLineAlpha = 0.3 # Peform the kernel density estimate xx, yy = np.mgrid[xmin:xmax:200j, ymin:ymax:200j] #print(self.ShapeGroups) #command='''xx, yy = np.mgrid[xmin:xmax:'''+str(self.ShapeGroups)+ '''j, ymin:ymax:''' +str(self.ShapeGroups)+'''j]''' #exec(command) #print(xx, yy) positions = np.vstack([xx.ravel(), yy.ravel()]) values = np.vstack([XtoFit,YtoFit]) kernelstatus = True try: st.gaussian_kde(values) except Exception as e: self.ErrorEvent(text=repr(e)) kernelstatus = False if kernelstatus== True: kernel = st.gaussian_kde(values) f = np.reshape(kernel(positions).T, xx.shape) # Contourf plot cfset = self.axes.contourf(xx, yy, f, cmap=DensityColorMap, alpha=DensityAlpha) ## Or kernel density estimate plot instead of the contourf plot #self.axes.imshow(np.rot90(f), cmap='Blues', extent=[xmin, xmax, ymin, ymax]) # Contour plot cset = self.axes.contour(xx, yy, f, colors=DensityLineColor, alpha=DensityLineAlpha) # Label plot self.axes.clabel(cset, inline=1, fontsize=10) if self.TypeLoaded=='svg': if self.polygon != 0 and self.polyline != 0 and self.line != 0: # print('gon: ',self.polygon,' \n line:',self.polyline) for i in self.polygon: self.DrawLine(i) for i in self.polyline: self.DrawLine(i) for i in self.line: self.DrawLine(i) # self.DrawLine(self.polygon) # self.DrawLine(self.polyline) if (self.legend_cb.isChecked()): self.axes.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0, prop=fontprop) self.canvas.draw() def relation(self,data1=np.ndarray,data2=np.ndarray): data=array([data1,data2]) dict={'cov':cov(data,bias=1),'corrcoef':corrcoef(data)} return(dict) def Stat(self): df=self._df m = ['Width', 'Style', 'Alpha', 'Size', 'Color', 'Marker', 'Author'] for i in m: if i in df.columns.values: df = df.drop(i, 1) df.set_index('Label', inplace=True) items = df.columns.values index = df.index.values StatResultDict = {} for i in items: StatResultDict[i] = self.stateval(df[i]) StdSortedList = sorted(StatResultDict.keys(), key=lambda x: StatResultDict[x]['std']) StdSortedList.reverse() StatResultDf = pd.DataFrame.from_dict(StatResultDict, orient='index') StatResultDf['Items']=StatResultDf.index.tolist() self.tablepop = TabelViewer(df=StatResultDf,title='Statistical Result') self.tablepop.show() self.Intro = StatResultDf return(StatResultDf)
class HarkerDIY(AppForm): Element = [ u'Cs', u'Tl', u'Rb', u'Ba', u'W', u'Th', u'U', u'Nb', u'Ta', u'K', u'La', u'Ce', u'Pb', u'Pr', u'Mo', u'Sr', u'P', u'Nd', u'F', u'Sm', u'Zr', u'Hf', u'Eu', u'Sn', u'Sb', u'Ti', u'Gd', u'Tb', u'Dy', u'Li', u'Y', u'Ho', u'Er', u'Tm', u'Yb', u'Lu' ] StandardsName = ['OIB', 'EMORB', 'C1', 'PM', 'NMORB'] reference = 'Reference: Sun, S. S., and Mcdonough, W. F., 1989, Chemical and isotopic systematics of oceanic basalts: implications for mantle composition and processes: Geological Society London Special Publications, v. 42, no. 1, p. 313-345.' sentence = '' NameChosen = 'OIB' Standards = { 'OIB': { 'Cs': 0.387, 'Tl': 0.077, 'Rb': 31, 'Ba': 350, 'W': 0.56, 'Th': 4, 'U': 1.02, 'Nb': 48, 'Ta': 2.7, 'K': 12000, 'La': 37, 'Ce': 80, 'Pb': 3.2, 'Pr': 9.7, 'Mo': 2.4, 'Sr': 660, 'P': 2700, 'Nd': 38.5, 'F': 1150, 'Sm': 10, 'Zr': 280, 'Hf': 7.8, 'Eu': 3, 'Sn': 2.7, 'Sb': 0.03, 'Ti': 17200, 'Gd': 7.62, 'Tb': 1.05, 'Dy': 5.6, 'Li': 5.6, 'Y': 29, 'Ho': 1.06, 'Er': 2.62, 'Tm': 0.35, 'Yb': 2.16, 'Lu': 0.3 }, 'EMORB': { 'Cs': 0.063, 'Tl': 0.013, 'Rb': 5.04, 'Ba': 57, 'W': 0.092, 'Th': 0.6, 'U': 0.18, 'Nb': 8.3, 'Ta': 0.47, 'K': 2100, 'La': 6.3, 'Ce': 15, 'Pb': 0.6, 'Pr': 2.05, 'Mo': 0.47, 'Sr': 155, 'P': 620, 'Nd': 9, 'F': 250, 'Sm': 2.6, 'Zr': 73, 'Hf': 2.03, 'Eu': 0.91, 'Sn': 0.8, 'Sb': 0.01, 'Ti': 6000, 'Gd': 2.97, 'Tb': 0.53, 'Dy': 3.55, 'Li': 3.5, 'Y': 22, 'Ho': 0.79, 'Er': 2.31, 'Tm': 0.356, 'Yb': 2.37, 'Lu': 0.354 }, 'C1': { 'Cs': 0.188, 'Tl': 0.14, 'Rb': 2.32, 'Ba': 2.41, 'W': 0.095, 'Th': 0.029, 'U': 0.008, 'Nb': 0.246, 'Ta': 0.014, 'K': 545, 'La': 0.237, 'Ce': 0.612, 'Pb': 2.47, 'Pr': 0.095, 'Mo': 0.92, 'Sr': 7.26, 'P': 1220, 'Nd': 0.467, 'F': 60.7, 'Sm': 0.153, 'Zr': 3.87, 'Hf': 0.1066, 'Eu': 0.058, 'Sn': 1.72, 'Sb': 0.16, 'Ti': 445, 'Gd': 0.2055, 'Tb': 0.0374, 'Dy': 0.254, 'Li': 1.57, 'Y': 1.57, 'Ho': 0.0566, 'Er': 0.1655, 'Tm': 0.0255, 'Yb': 0.17, 'Lu': 0.0254 }, 'PM': { 'Cs': 0.032, 'Tl': 0.005, 'Rb': 0.635, 'Ba': 6.989, 'W': 0.02, 'Th': 0.085, 'U': 0.021, 'Nb': 0.713, 'Ta': 0.041, 'K': 250, 'La': 0.687, 'Ce': 1.775, 'Pb': 0.185, 'Pr': 0.276, 'Mo': 0.063, 'Sr': 21.1, 'P': 95, 'Nd': 1.354, 'F': 26, 'Sm': 0.444, 'Zr': 11.2, 'Hf': 0.309, 'Eu': 0.168, 'Sn': 0.17, 'Sb': 0.005, 'Ti': 1300, 'Gd': 0.596, 'Tb': 0.108, 'Dy': 0.737, 'Li': 1.6, 'Y': 4.55, 'Ho': 0.164, 'Er': 0.48, 'Tm': 0.074, 'Yb': 0.493, 'Lu': 0.074 }, 'NMORB': { 'Cs': 0.007, 'Tl': 0.0014, 'Rb': 0.56, 'Ba': 6.3, 'W': 0.01, 'Th': 0.12, 'U': 0.047, 'Nb': 2.33, 'Ta': 0.132, 'K': 600, 'La': 2.5, 'Ce': 7.5, 'Pb': 0.3, 'Pr': 1.32, 'Mo': 0.31, 'Sr': 90, 'P': 510, 'Nd': 7.3, 'F': 210, 'Sm': 2.63, 'Zr': 74, 'Hf': 2.05, 'Eu': 1.02, 'Sn': 1.1, 'Sb': 0.01, 'Ti': 7600, 'Gd': 3.68, 'Tb': 0.67, 'Dy': 4.55, 'Li': 4.3, 'Y': 28, 'Ho': 1.01, 'Er': 2.97, 'Tm': 0.456, 'Yb': 3.05, 'Lu': 0.455 }, } Lines = [] Tags = [] xlabel = 'x' ylabel = 'y' description = 'Advanced Harker Diagram' unuseful = [ 'Name', 'Mineral', 'Author', 'DataType', 'Label', 'Marker', 'Color', 'Size', 'Alpha', 'Style', 'Width', 'Tag' ] width_plot = 100.0 height_plot = 100.0 width_load = width_plot height_load = height_plot polygon = [] polyline = [] line = [] strgons = [] strlines = [] strpolylines = [] extent = 0 Left = 0 Right = 0 Up = 0 Down = 0 FitLevel = 3 FadeGroups = 100 ShapeGroups = 200 Xleft, Xright, Ydown, Yup = 0, 0, 0, 0 LimSet = False LabelSetted = False ValueChoosed = True def __init__(self, parent=None, df=pd.DataFrame()): QMainWindow.__init__(self, parent) self.setWindowTitle(self.description) self.items = [] self._df = df if (len(df) > 0): self._changed = True # print('DataFrame recieved to Magic') self.raw = df self.rawitems = self.raw.columns.values.tolist() for i in self.rawitems: if i not in self.unuseful: self.items.append(i) else: pass self.create_main_frame() self.create_status_bar() self.polygon = 0 self.polyline = 0 self.flag = 0 def create_main_frame(self): self.resize(800, 800) self.main_frame = QWidget() self.dpi = 128 self.fig = Figure((8.0, 8.0), dpi=self.dpi) self.fig.subplots_adjust(hspace=0.5, wspace=0.5, left=0.3, bottom=0.3, right=0.7, top=0.9) self.canvas = FigureCanvas(self.fig) self.canvas.setParent(self.main_frame) self.axes = self.fig.add_subplot(111) # self.axes.hold(False) # Create the navigation toolbar, tied to the canvas self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame) # Other GUI controls self.save_button = QPushButton('&Save') self.save_button.clicked.connect(self.saveImgFile) self.draw_button = QPushButton('&Reset') self.draw_button.clicked.connect(self.Reset) self.stat_button = QPushButton('&Stat') self.stat_button.clicked.connect(self.Stat) self.load_button = QPushButton('&Load') self.load_button.clicked.connect(self.Load) self.legend_cb = QCheckBox('&Legend') self.legend_cb.setChecked(True) self.legend_cb.stateChanged.connect(self.Magic) # int self.fit_cb = QCheckBox('&PolyFit') self.fit_cb.setChecked(False) self.fit_cb.stateChanged.connect(self.Magic) # int self.fit_label = QLabel('Exp') self.fit_seter = QLineEdit(self) self.fit_seter.textChanged[str].connect(self.FitChanged) self.fit_slider_label = QLabel('y= f(x)') self.fit_slider = QSlider(Qt.Vertical) self.fit_slider.setRange(0, 1) self.fit_slider.setValue(0) self.fit_slider.setTracking(True) self.fit_slider.setTickPosition(QSlider.TicksBothSides) self.fit_slider.valueChanged.connect(self.Magic) # int self.xlim_seter_left_label = QLabel('Xleft') self.xlim_seter_left = QLineEdit(self) self.xlim_seter_left.textChanged[str].connect(self.XleftChanged) self.xlim_seter_right_label = QLabel('Xright') self.xlim_seter_right = QLineEdit(self) self.xlim_seter_right.textChanged[str].connect(self.XrightChanged) self.ylim_seter_down_label = QLabel('Ydown') self.ylim_seter_down = QLineEdit(self) self.ylim_seter_down.textChanged[str].connect(self.YdownChanged) self.ylim_seter_up_label = QLabel('Yup') self.ylim_seter_up = QLineEdit(self) self.ylim_seter_up.textChanged[str].connect(self.YupChanged) self.shape_cb = QCheckBox('&Shape') self.shape_cb.setChecked(False) self.shape_cb.stateChanged.connect(self.Magic) # int self.shape_label = QLabel('Step') self.shape_seter = QLineEdit(self) self.shape_seter.textChanged[str].connect(self.ShapeChanged) self.Normalize_cb = QCheckBox('&Normalize') self.Normalize_cb.setChecked(False) self.Normalize_cb.stateChanged.connect(self.Magic) # int self.norm_slider_label = QLabel('Standard:' + self.NameChosen) self.norm_slider = QSlider(Qt.Horizontal) self.norm_slider.setRange(0, 4) self.norm_slider.setValue(0) self.norm_slider.setTracking(True) self.norm_slider.setTickPosition(QSlider.TicksBothSides) self.norm_slider.valueChanged.connect(self.Magic) # int self.x_element = QSlider(Qt.Horizontal) self.x_element.setRange(0, len(self.items) - 1) self.x_element.setValue(0) self.x_element.setTracking(True) self.x_element.setTickPosition(QSlider.TicksBothSides) self.x_element.valueChanged.connect(self.ValueChooser) # int self.x_element_label = QLabel('X') self.x_seter = QLineEdit(self) self.x_seter.textChanged[str].connect(self.LabelSeter) #self.x_calculator = QLineEdit(self) self.logx_cb = QCheckBox('&Log') self.logx_cb.setChecked(False) self.logx_cb.stateChanged.connect(self.Magic) # int self.y_element = QSlider(Qt.Horizontal) self.y_element.setRange(0, len(self.items) - 1) self.y_element.setValue(1) self.y_element.setTracking(True) self.y_element.setTickPosition(QSlider.TicksBothSides) self.y_element.valueChanged.connect(self.ValueChooser) # int self.y_element_label = QLabel('Y') self.y_seter = QLineEdit(self) self.y_seter.textChanged[str].connect(self.LabelSeter) #self.y_calculator = QLineEdit(self) self.logy_cb = QCheckBox('&Log') self.logy_cb.setChecked(False) self.logy_cb.stateChanged.connect(self.Magic) # int self.width_size_seter_label = QLabel('Width') self.width_size_seter = QLineEdit(self) self.width_size_seter.textChanged[str].connect(self.WChanged) self.height_size_seter_label = QLabel('height') self.height_size_seter = QLineEdit(self) self.height_size_seter.textChanged[str].connect(self.HChanged) self.Left_size_seter_label = QLabel('Left') self.Left_size_seter = QLineEdit(self) self.Left_size_seter.textChanged[str].connect(self.LeftChanged) self.Right_size_seter_label = QLabel('Right') self.Right_size_seter = QLineEdit(self) self.Right_size_seter.textChanged[str].connect(self.RightChanged) self.Up_size_seter_label = QLabel('Up') self.Up_size_seter = QLineEdit(self) self.Up_size_seter.textChanged[str].connect(self.UpChanged) self.Down_size_seter_label = QLabel('Down') self.Down_size_seter = QLineEdit(self) self.Down_size_seter.textChanged[str].connect(self.DownChanged) # # Layout with box sizers # self.hbox0 = QHBoxLayout() self.hbox1 = QHBoxLayout() self.hbox2 = QHBoxLayout() self.hbox3 = QHBoxLayout() self.hbox4 = QHBoxLayout() self.hbox5 = QHBoxLayout() self.hbox6 = QHBoxLayout() self.hbox7 = QHBoxLayout() for w in [ self.save_button, self.stat_button, self.draw_button, self.load_button, self.legend_cb, self.Normalize_cb, self.norm_slider_label, self.norm_slider ]: self.hbox0.addWidget(w) self.hbox0.setAlignment(w, Qt.AlignVCenter) for w in [ self.fit_slider_label, self.fit_slider, self.fit_cb, self.fit_label, self.fit_seter, self.xlim_seter_left_label, self.xlim_seter_left, self.xlim_seter_right_label, self.xlim_seter_right, self.ylim_seter_down_label, self.ylim_seter_down, self.ylim_seter_up_label, self.ylim_seter_up, self.shape_cb, self.shape_label, self.shape_seter ]: self.hbox1.addWidget(w) self.hbox1.setAlignment(w, Qt.AlignVCenter) for w in [ self.logx_cb, self.x_element_label, self.x_seter, self.x_element ]: self.hbox2.addWidget(w) self.hbox2.setAlignment(w, Qt.AlignVCenter) for w in [ self.logy_cb, self.y_element_label, self.y_seter, self.y_element ]: self.hbox3.addWidget(w) self.hbox3.setAlignment(w, Qt.AlignVCenter) for w in [self.width_size_seter_label, self.width_size_seter]: self.hbox4.addWidget(w) self.hbox4.setAlignment(w, Qt.AlignVCenter) for w in [self.height_size_seter_label, self.height_size_seter]: self.hbox5.addWidget(w) self.hbox5.setAlignment(w, Qt.AlignVCenter) for w in [ self.Left_size_seter, self.Left_size_seter_label, self.Right_size_seter, self.Right_size_seter_label ]: self.hbox6.addWidget(w) self.hbox6.setAlignment(w, Qt.AlignVCenter) for w in [ self.Down_size_seter, self.Down_size_seter_label, self.Up_size_seter, self.Up_size_seter_label ]: self.hbox7.addWidget(w) self.hbox7.setAlignment(w, Qt.AlignVCenter) self.vbox = QVBoxLayout() self.vbox.addWidget(self.mpl_toolbar) self.vbox.addWidget(self.canvas) self.vbox.addLayout(self.hbox0) self.vbox.addLayout(self.hbox1) self.vbox.addLayout(self.hbox2) self.vbox.addLayout(self.hbox3) self.vbox.addLayout(self.hbox4) self.vbox.addLayout(self.hbox5) self.vbox.addLayout(self.hbox6) self.vbox.addLayout(self.hbox7) self.textbox = GrowingTextEdit(self) self.vbox.addWidget(self.textbox) self.main_frame.setLayout(self.vbox) self.setCentralWidget(self.main_frame) def Read(self, inpoints): points = [] for i in inpoints: points.append(i.split()) result = [] for i in points: for l in range(len(i)): a = float((i[l].split(','))[0]) a = a * self.x_scale b = float((i[l].split(','))[1]) b = (self.height_load - b) * self.y_scale result.append((a, b)) return (result) def Load(self): fileName, filetype = QFileDialog.getOpenFileName( self, '选取文件', '~/', 'PNG Files (*.png);;JPG Files (*.jpg);;SVG Files (*.svg)' ) # 设置文件扩展名过滤,注意用双分号间隔 print(fileName, '\t', filetype) if ('svg' in fileName): doc = minidom.parse(fileName) # parseString also exists polygon_points = [ path.getAttribute('points') for path in doc.getElementsByTagName('polygon') ] polyline_points = [ path.getAttribute('points') for path in doc.getElementsByTagName('polyline') ] svg_width = [ path.getAttribute('width') for path in doc.getElementsByTagName('svg') ] svg_height = [ path.getAttribute('height') for path in doc.getElementsByTagName('svg') ] # print(svg_width) # print(svg_height) digit = '01234567890.-' width = svg_width[0].replace('px', '').replace('pt', '') height = svg_height[0].replace('px', '').replace('pt', '') self.width_load = float(width) self.height_load = float(height) soup = BeautifulSoup(open(fileName), 'lxml') tmpgon = soup.find_all('polygon') tmppolyline = soup.find_all('polyline') tmptext = soup.find_all('text') tmpline = soup.find_all('line') tmppath = soup.find_all('path') self.strgons = [] for i in tmpgon: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.polygon.attrs self.strgons.append(k['points'].split()) self.strpolylines = [] for i in tmppolyline: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.polyline.attrs self.strpolylines.append(k['points'].split()) self.strlines = [] for i in tmpline: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.line.attrs a = str(k['x1']) + ',' + str(k['y1']) + ' ' + str( k['x2']) + ',' + str(k['y2']) self.strlines.append(a.split()) self.strpath = [] for i in tmppath: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.path.attrs self.strpath.append(k['d'].split()) # print(self.strpath) self.polygon = [] for i in self.strgons: m = self.Read(i) m.append(m[0]) self.polygon.append(m) self.polyline = [] for i in self.strpolylines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.polyline.append(m) self.line = [] for i in self.strlines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.line.append(m) elif ('png' in fileName or 'jpg' in fileName): self.img = mpimg.imread(fileName) self.flag = 1 self.Magic() def Reset(self): self.flag = 0 self.Magic() def WChanged(self, text): w = 'width ' + text self.width_size_seter_label.setText(w) self.width_size_seter_label.adjustSize() try: self.width_plot = float(text) except: pass self.x_scale = self.width_plot / self.width_load self.polygon = [] for i in self.strgons: m = self.Read(i) m.append(m[0]) self.polygon.append(m) self.polyline = [] for i in self.strpolylines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.polyline.append(m) self.line = [] for i in self.strlines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.line.append(m) self.Magic() def HChanged(self, text): h = 'height ' + text self.height_size_seter_label.setText(h) self.height_size_seter_label.adjustSize() try: self.height_plot = float(text) except: pass self.y_scale = self.height_plot / self.height_load self.polygon = [] for i in self.strgons: m = self.Read(i) m.append(m[0]) self.polygon.append(m) self.polyline = [] for i in self.strpolylines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.polyline.append(m) self.line = [] for i in self.strlines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.line.append(m) self.Magic() # text_location= [path.getAttribute('transform') for path in doc.getElementsByTagName('text')] ''' tmppolygon_points=[] for i in polygon_points: tmppolygon_points.append(i.split()) polygon=[] for i in tmppolygon_points: for l in range(len(i)): a=float((i[l].split(','))[0]) b=float((i[l].split(','))[1]) polygon.append([a,b]) ''' def LeftChanged(self, text): w = 'Left ' + text self.Left_size_seter_label.setText(w) self.Left_size_seter_label.adjustSize() try: self.Left = float(text) except: pass self.Magic() def RightChanged(self, text): w = 'Right ' + text self.Right_size_seter_label.setText(w) self.Right_size_seter_label.adjustSize() try: self.Right = float(text) except: pass self.Magic() def UpChanged(self, text): w = 'Up ' + text self.Up_size_seter_label.setText(w) self.Up_size_seter_label.adjustSize() try: self.Up = float(text) except: pass self.Magic() def DownChanged(self, text): w = 'Down ' + text self.Down_size_seter_label.setText(w) self.Down_size_seter_label.adjustSize() try: self.Down = float(text) except: pass self.Magic() def FitChanged(self, text): w = 'Fit Exp is' + text self.fit_label.setText(w) self.fit_label.adjustSize() try: self.FitLevel = float(text) except: pass self.Magic() def ShapeChanged(self, text): w = 'Shape' + text self.shape_label.setText(w) self.shape_label.adjustSize() try: self.ShapeGroups = int(text) except: pass self.Magic() def XleftChanged(self, text): if len(text) < 1: self.LimSet = False else: self.LimSet = True try: self.Xleft = float(text) except: pass self.Magic() def XrightChanged(self, text): if len(text) < 1: self.LimSet = False else: self.LimSet = True try: self.Xright = float(text) except: pass self.Magic() def YdownChanged(self, text): if len(text) < 1: self.LimSet = False else: self.LimSet = True try: self.Ydown = float(text) except: pass self.Magic() def YupChanged(self, text): if len(text) < 1: self.LimSet = False else: self.LimSet = True try: self.Yup = float(text) except: pass self.Magic() def LabelSeter(self): self.LabelSetted = True self.ValueChoosed = False self.Magic() def ValueChooser(self): self.LabelSetted = False self.ValueChoosed = True self.Magic() def Magic(self): self.WholeData = [] self.x_scale = self.width_plot / self.width_load self.y_scale = self.height_plot / self.height_load # print(self.x_scale,' and ',self.x_scale) raw = self._df dataframe = self._df ItemsAvalibale = self._df.columns.values.tolist() ItemsToTest = [ 'Number', 'Tag', 'Name', 'Author', 'DataType', 'Marker', 'Color', 'Size', 'Alpha', 'Style', 'Width', 'Label' ] for i in ItemsToTest: if i in ItemsAvalibale: dataframe = dataframe.drop(i, 1) ItemsAvalibale = dataframe.columns.values.tolist() a = int(self.x_element.value()) b = int(self.y_element.value()) if self.LabelSetted == True: if (self.x_seter.text() != ''): try: a = int(self.x_seter.text()) except (ValueError): atmp = self.x_seter.text() try: if atmp in ItemsAvalibale: a = ItemsAvalibale.index(atmp) print(a) except (ValueError): pass pass else: a = int(self.x_element.value()) if (self.y_seter.text() != ''): try: b = int(self.y_seter.text()) except (ValueError): btmp = self.y_seter.text() try: if btmp in ItemsAvalibale: b = ItemsAvalibale.index(btmp) print(b) except (ValueError): pass pass else: b = int(self.y_element.value()) if b > len(ItemsAvalibale) - 1: b = int(self.y_element.value()) if a > len(ItemsAvalibale) - 1: a = int(self.x_element.value()) if self.ValueChoosed == True: a = int(self.x_element.value()) b = int(self.y_element.value()) self.axes.clear() if (self.Left != self.Right) and ( self.Down != self.Up) and abs(self.Left) + abs( self.Right) + abs(self.Down) + abs(self.Up) != 0: self.extent = [self.Left, self.Right, self.Down, self.Up] elif (self.Left == self.Right and abs(self.Left) + abs(self.Right) != 0): reply = QMessageBox.warning( self, 'Warning', 'You set same value to Left and Right limits.') self.extent = 0 elif (self.Down == self.Up and abs(self.Down) + abs(self.Up) != 0): reply = QMessageBox.warning( self, 'Warning', 'You set same value to Up and Down limits.') self.extent = 0 else: self.extent = 0 standardnamechosen = self.StandardsName[int(self.norm_slider.value())] standardchosen = self.Standards[standardnamechosen] self.norm_slider_label.setText(standardnamechosen) if self.flag != 0: if self.extent != 0: self.axes.imshow(self.img, interpolation='nearest', aspect='auto', extent=self.extent) else: self.axes.imshow(self.img, interpolation='nearest', aspect='auto') self.axes.set_xlabel(ItemsAvalibale[a]) self.x_element_label.setText(ItemsAvalibale[a]) self.axes.set_ylabel(ItemsAvalibale[b]) self.y_element_label.setText(ItemsAvalibale[b]) PointLabels = [] XtoFit = [] YtoFit = [] for i in range(len(raw)): # raw.at[i, 'DataType'] == 'User' or raw.at[i, 'DataType'] == 'user' or raw.at[i, 'DataType'] == 'USER' TmpLabel = '' # self.WholeData.append(math.log(tmp, 10)) if (raw.at[i, 'Label'] in PointLabels or raw.at[i, 'Label'] == ''): TmpLabel = '' else: PointLabels.append(raw.at[i, 'Label']) TmpLabel = raw.at[i, 'Label'] x, y = 0, 0 xuse, yuse = 0, 0 if pd.isnull(dataframe.at[i, self.items[a]]) or pd.isnull( dataframe.at[i, self.items[b]]): pass else: #if dataframe.at[i, self.items[a]]!='nan' and dataframe.at[i, self.items[b]]!='nan': x, y = dataframe.at[i, self.items[a]], dataframe.at[i, self.items[b]] try: xuse = x yuse = y self.xlabel = self.items[a] self.ylabel = self.items[b] if (self.Normalize_cb.isChecked()): self.sentence = self.reference if self.items[a] in self.Element: self.xlabel = self.items[ a] + ' Norm by ' + standardnamechosen xuse = xuse / standardchosen[self.items[a]] if self.items[b] in self.Element: self.ylabel = self.items[ b] + ' Norm by ' + standardnamechosen yuse = yuse / standardchosen[self.items[b]] if (self.logx_cb.isChecked()): xuse = math.log(x, 10) self.xlabel = '$log10$( ' + self.xlabel + ')' self.axes.set_xlabel(self.xlabel) if (self.logy_cb.isChecked()): yuse = math.log(y, 10) self.ylabel = '$log10$( ' + self.ylabel + ')' self.axes.set_ylabel(self.ylabel) self.axes.scatter(xuse, yuse, marker=raw.at[i, 'Marker'], s=raw.at[i, 'Size'], color=raw.at[i, 'Color'], alpha=raw.at[i, 'Alpha'], label=TmpLabel, edgecolors='black') XtoFit.append(xuse) YtoFit.append(yuse) except (ValueError): pass self.axes.set_xlabel(self.xlabel) self.axes.set_ylabel(self.ylabel) self.x_element_label.setText(self.xlabel) self.y_element_label.setText(self.ylabel) if self.LimSet == False: self.Xleft, self.Xright, self.Ydown, self.Yup = min(XtoFit), max( XtoFit), min(YtoFit), max(YtoFit) if self.LimSet == True: self.axes.set_xlim(self.Xleft, self.Xright) self.axes.set_ylim(self.Ydown, self.Yup) #Yline = np.linspace(min(YtoFit), max(YtoFit), 30) ResultStr = '' BoxResultStr = '' Paralist = [] print(XtoFit, '\n', YtoFit) if len(XtoFit) != len(YtoFit): reply = QMessageBox.information( self, 'Warning', 'Your Data X and Y have different length!') pass # self.DrawLine(self.polygon) # self.DrawLine(self.polyline) if (self.legend_cb.isChecked()): self.axes.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0, prop=fontprop) self.canvas.draw() def stateval(self, data=np.ndarray): dict = { 'mean': mean(data), 'ptp': ptp(data), 'var': var(data), 'std': std(data), 'cv': mean(data) / std(data) } return (dict) def relation(self, data1=np.ndarray, data2=np.ndarray): data = array([data1, data2]) dict = {'cov': cov(data, bias=1), 'corrcoef': corrcoef(data)} return (dict) def Stat(self): df = self._df m = ['Width', 'Style', 'Alpha', 'Size', 'Color', 'Marker', 'Author'] for i in m: if i in df.columns.values: df = df.drop(i, 1) df.set_index('Label', inplace=True) items = df.columns.values index = df.index.values StatResultDict = {} for i in items: StatResultDict[i] = self.stateval(df[i]) StdSortedList = sorted(StatResultDict.keys(), key=lambda x: StatResultDict[x]['std']) StdSortedList.reverse() for k in sorted(StatResultDict.keys(), key=lambda x: StatResultDict[x]['std']): print("%s=%s" % (k, StatResultDict[k])) StatResultDf = pd.DataFrame.from_dict(StatResultDict, orient='index') StatResultDf['Items'] = StatResultDf.index.tolist() self.tablepop = TabelViewer(df=StatResultDf, title='X-Y Statistical Result') self.tablepop.show() self.Intro = StatResultDf return (StatResultDf)
class XY(AppForm): Element = [ u'Cs', u'Tl', u'Rb', u'Ba', u'W', u'Th', u'U', u'Nb', u'Ta', u'K', u'La', u'Ce', u'Pb', u'Pr', u'Mo', u'Sr', u'P', u'Nd', u'F', u'Sm', u'Zr', u'Hf', u'Eu', u'Sn', u'Sb', u'Ti', u'Gd', u'Tb', u'Dy', u'Li', u'Y', u'Ho', u'Er', u'Tm', u'Yb', u'Lu' ] StandardsName = ['OIB', 'EMORB', 'C1', 'PM', 'NMORB'] reference = 'Reference: Sun, S. S., and Mcdonough, W. F., 1989, Chemical and isotopic systematics of oceanic basalts: implications for mantle composition and processes: Geological Society London Special Publications, v. 42, no. 1, p. 313-345.' sentence = '' ContainNan = False NameChosen = 'OIB' Standards = { 'OIB': { 'Cs': 0.387, 'Tl': 0.077, 'Rb': 31, 'Ba': 350, 'W': 0.56, 'Th': 4, 'U': 1.02, 'Nb': 48, 'Ta': 2.7, 'K': 12000, 'La': 37, 'Ce': 80, 'Pb': 3.2, 'Pr': 9.7, 'Mo': 2.4, 'Sr': 660, 'P': 2700, 'Nd': 38.5, 'F': 1150, 'Sm': 10, 'Zr': 280, 'Hf': 7.8, 'Eu': 3, 'Sn': 2.7, 'Sb': 0.03, 'Ti': 17200, 'Gd': 7.62, 'Tb': 1.05, 'Dy': 5.6, 'Li': 5.6, 'Y': 29, 'Ho': 1.06, 'Er': 2.62, 'Tm': 0.35, 'Yb': 2.16, 'Lu': 0.3 }, 'EMORB': { 'Cs': 0.063, 'Tl': 0.013, 'Rb': 5.04, 'Ba': 57, 'W': 0.092, 'Th': 0.6, 'U': 0.18, 'Nb': 8.3, 'Ta': 0.47, 'K': 2100, 'La': 6.3, 'Ce': 15, 'Pb': 0.6, 'Pr': 2.05, 'Mo': 0.47, 'Sr': 155, 'P': 620, 'Nd': 9, 'F': 250, 'Sm': 2.6, 'Zr': 73, 'Hf': 2.03, 'Eu': 0.91, 'Sn': 0.8, 'Sb': 0.01, 'Ti': 6000, 'Gd': 2.97, 'Tb': 0.53, 'Dy': 3.55, 'Li': 3.5, 'Y': 22, 'Ho': 0.79, 'Er': 2.31, 'Tm': 0.356, 'Yb': 2.37, 'Lu': 0.354 }, 'C1': { 'Cs': 0.188, 'Tl': 0.14, 'Rb': 2.32, 'Ba': 2.41, 'W': 0.095, 'Th': 0.029, 'U': 0.008, 'Nb': 0.246, 'Ta': 0.014, 'K': 545, 'La': 0.237, 'Ce': 0.612, 'Pb': 2.47, 'Pr': 0.095, 'Mo': 0.92, 'Sr': 7.26, 'P': 1220, 'Nd': 0.467, 'F': 60.7, 'Sm': 0.153, 'Zr': 3.87, 'Hf': 0.1066, 'Eu': 0.058, 'Sn': 1.72, 'Sb': 0.16, 'Ti': 445, 'Gd': 0.2055, 'Tb': 0.0374, 'Dy': 0.254, 'Li': 1.57, 'Y': 1.57, 'Ho': 0.0566, 'Er': 0.1655, 'Tm': 0.0255, 'Yb': 0.17, 'Lu': 0.0254 }, 'PM': { 'Cs': 0.032, 'Tl': 0.005, 'Rb': 0.635, 'Ba': 6.989, 'W': 0.02, 'Th': 0.085, 'U': 0.021, 'Nb': 0.713, 'Ta': 0.041, 'K': 250, 'La': 0.687, 'Ce': 1.775, 'Pb': 0.185, 'Pr': 0.276, 'Mo': 0.063, 'Sr': 21.1, 'P': 95, 'Nd': 1.354, 'F': 26, 'Sm': 0.444, 'Zr': 11.2, 'Hf': 0.309, 'Eu': 0.168, 'Sn': 0.17, 'Sb': 0.005, 'Ti': 1300, 'Gd': 0.596, 'Tb': 0.108, 'Dy': 0.737, 'Li': 1.6, 'Y': 4.55, 'Ho': 0.164, 'Er': 0.48, 'Tm': 0.074, 'Yb': 0.493, 'Lu': 0.074 }, 'NMORB': { 'Cs': 0.007, 'Tl': 0.0014, 'Rb': 0.56, 'Ba': 6.3, 'W': 0.01, 'Th': 0.12, 'U': 0.047, 'Nb': 2.33, 'Ta': 0.132, 'K': 600, 'La': 2.5, 'Ce': 7.5, 'Pb': 0.3, 'Pr': 1.32, 'Mo': 0.31, 'Sr': 90, 'P': 510, 'Nd': 7.3, 'F': 210, 'Sm': 2.63, 'Zr': 74, 'Hf': 2.05, 'Eu': 1.02, 'Sn': 1.1, 'Sb': 0.01, 'Ti': 7600, 'Gd': 3.68, 'Tb': 0.67, 'Dy': 4.55, 'Li': 4.3, 'Y': 28, 'Ho': 1.01, 'Er': 2.97, 'Tm': 0.456, 'Yb': 3.05, 'Lu': 0.455 }, } Lines = [] Tags = [] xlabel = 'x' ylabel = 'y' description = 'X-Y Diagram' unuseful = [ 'Name', 'Mineral', 'Author', 'DataType', 'Label', 'Marker', 'Color', 'Size', 'Alpha', 'Style', 'Width', 'Tag' ] width_plot = 100.0 height_plot = 100.0 width_load = width_plot height_load = height_plot polygon = [] polyline = [] line = [] strgons = [] strlines = [] strpolylines = [] extent = 0 Left = 0 Right = 0 Up = 0 Down = 0 FitLevel = 3 FadeGroups = 100 ShapeGroups = 200 LabelSetted = False ValueChoosed = True FlagLoaded = False TypeLoaded = '' def __init__(self, parent=None, df=pd.DataFrame(), Standard={}): QMainWindow.__init__(self, parent) self.setWindowTitle(self.description) self.items = [] self._df = df self._given_Standard = Standard if (len(df) > 0): self._changed = True # print('DataFrame recieved to Magic') self.raw = df self.rawitems = self.raw.columns.values.tolist() for i in self.rawitems: if i not in self.unuseful: self.items.append(i) else: pass self.create_main_frame() self.create_status_bar() self.polygon = 0 self.polyline = 0 self.flag = 0 def create_main_frame(self): self.resize(800, 800) self.main_frame = QWidget() self.dpi = 128 self.fig = Figure((8.0, 8.0), dpi=self.dpi) self.fig.subplots_adjust(hspace=0.5, wspace=0.5, left=0.3, bottom=0.3, right=0.7, top=0.9) self.canvas = FigureCanvas(self.fig) self.canvas.setParent(self.main_frame) self.axes = self.fig.add_subplot(111) # self.axes.hold(False) # Create the navigation toolbar, tied to the canvas self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame) # Other GUI controls self.save_button = QPushButton('&Save') self.save_button.clicked.connect(self.saveImgFile) self.stat_button = QPushButton('&Stat') self.stat_button.clicked.connect(self.Stat) self.load_button = QPushButton('&Load Basemap') self.load_button.clicked.connect(self.Load) self.unload_button = QPushButton('&Unload Basemap') self.unload_button.clicked.connect(self.Unload) self.legend_cb = QCheckBox('&Legend') self.legend_cb.setChecked(True) self.legend_cb.stateChanged.connect(self.Magic) # int self.fit_cb = QCheckBox('&PolyFit') self.fit_cb.setChecked(False) self.fit_cb.stateChanged.connect(self.Magic) # int self.fit_seter = QLineEdit(self) self.fit_seter.textChanged[str].connect(self.FitChanged) self.fit_slider_label = QLabel('y= f(x) EXP') self.fit_slider = QSlider(Qt.Vertical) self.fit_slider.setRange(0, 1) self.fit_slider.setValue(0) self.fit_slider.setTracking(True) self.fit_slider.setTickPosition(QSlider.TicksBothSides) self.fit_slider.valueChanged.connect(self.Magic) # int self.shape_cb = QCheckBox('&Shape') self.shape_cb.setChecked(False) self.shape_cb.stateChanged.connect(self.Magic) # int #self.shape_label = QLabel('Step') #self.shape_seter = QLineEdit(self) #self.shape_seter.textChanged[str].connect(self.ShapeChanged) self.norm_cb = QCheckBox('&Norm') self.norm_cb.setChecked(False) self.norm_cb.stateChanged.connect(self.Magic) # int self.standard_slider = QSlider(Qt.Horizontal) self.standard_slider.setRange(0, len(self.StandardsName)) if len(self._given_Standard) > 0: self.standard_slider.setValue(len(self.StandardsName)) self.right_label = QLabel("Self Defined Standard") else: self.standard_slider.setValue(0) self.right_label = QLabel(self.StandardsName[int( self.standard_slider.value())]) self.standard_slider.setTracking(True) self.standard_slider.setTickPosition(QSlider.TicksBothSides) self.standard_slider.valueChanged.connect(self.Magic) # int self.left_label = QLabel('Standard') self.x_element = QSlider(Qt.Horizontal) self.x_element.setRange(0, len(self.items) - 1) self.x_element.setValue(0) self.x_element.setTracking(True) self.x_element.setTickPosition(QSlider.TicksBothSides) self.x_element.valueChanged.connect(self.ValueChooser) # int self.x_seter = QLineEdit(self) self.x_seter.textChanged[str].connect(self.LabelSeter) #self.x_calculator = QLineEdit(self) self.logx_cb = QCheckBox('&Log') self.logx_cb.setChecked(False) self.logx_cb.stateChanged.connect(self.Magic) # int self.y_element = QSlider(Qt.Horizontal) self.y_element.setRange(0, len(self.items) - 1) self.y_element.setValue(1) self.y_element.setTracking(True) self.y_element.setTickPosition(QSlider.TicksBothSides) self.y_element.valueChanged.connect(self.ValueChooser) # int self.y_seter = QLineEdit(self) self.y_seter.textChanged[str].connect(self.LabelSeter) #self.y_calculator = QLineEdit(self) self.logy_cb = QCheckBox('&Log') self.logy_cb.setChecked(False) self.logy_cb.stateChanged.connect(self.Magic) # int self.width_size_seter_label = QLabel('SVG Width') self.width_size_seter = QLineEdit(self) self.width_size_seter.textChanged[str].connect(self.WChanged) self.height_size_seter_label = QLabel('SVG Height') self.height_size_seter = QLineEdit(self) self.height_size_seter.textChanged[str].connect(self.HChanged) self.Left_size_seter_label = QLabel('PNG Left') self.Left_size_seter = QLineEdit(self) self.Left_size_seter.textChanged[str].connect(self.LeftChanged) self.Right_size_seter_label = QLabel('PNG Right') self.Right_size_seter = QLineEdit(self) self.Right_size_seter.textChanged[str].connect(self.RightChanged) self.Up_size_seter_label = QLabel('PNG Top') self.Up_size_seter = QLineEdit(self) self.Up_size_seter.textChanged[str].connect(self.UpChanged) self.Down_size_seter_label = QLabel('PNG Bottom') self.Down_size_seter = QLineEdit(self) self.Down_size_seter.textChanged[str].connect(self.DownChanged) # # Layout with box sizers # self.hbox0 = QHBoxLayout() self.hbox1 = QHBoxLayout() self.hbox2 = QHBoxLayout() self.hbox3 = QHBoxLayout() self.hbox4 = QHBoxLayout() for w in [ self.save_button, self.stat_button, self.legend_cb, self.norm_cb, self.left_label, self.standard_slider, self.right_label, self.shape_cb, self.fit_cb, self.fit_slider, self.fit_slider_label, self.fit_seter ]: self.hbox0.addWidget(w) self.hbox0.setAlignment(w, Qt.AlignVCenter) for w in [self.logx_cb, self.x_seter, self.x_element]: self.hbox1.addWidget(w) self.hbox1.setAlignment(w, Qt.AlignVCenter) for w in [self.logy_cb, self.y_seter, self.y_element]: self.hbox2.addWidget(w) self.hbox2.setAlignment(w, Qt.AlignVCenter) for w in [ self.load_button, self.width_size_seter_label, self.width_size_seter, self.height_size_seter_label, self.height_size_seter ]: self.hbox3.addWidget(w) self.hbox3.setAlignment(w, Qt.AlignLeft) for w in [ self.unload_button, self.Left_size_seter_label, self.Left_size_seter, self.Right_size_seter_label, self.Right_size_seter, self.Down_size_seter_label, self.Down_size_seter, self.Up_size_seter_label, self.Up_size_seter ]: self.hbox4.addWidget(w) self.hbox4.setAlignment(w, Qt.AlignLeft) self.vbox = QVBoxLayout() self.vbox.addWidget(self.mpl_toolbar) self.vbox.addWidget(self.canvas) self.vbox.addLayout(self.hbox0) self.vbox.addLayout(self.hbox1) self.vbox.addLayout(self.hbox2) self.vbox.addLayout(self.hbox3) self.vbox.addLayout(self.hbox4) self.textbox = GrowingTextEdit(self) self.vbox.addWidget(self.textbox) self.main_frame.setLayout(self.vbox) self.setCentralWidget(self.main_frame) w = self.width() h = self.height() self.x_seter.setFixedWidth(w / 10) self.y_seter.setFixedWidth(w / 10) self.save_button.setFixedWidth(w / 10) self.stat_button.setFixedWidth(w / 10) self.standard_slider.setFixedWidth(w / 5) self.right_label.setFixedWidth(w / 5) self.fit_seter.setFixedWidth(w / 20) self.load_button.setFixedWidth(w / 5) self.unload_button.setFixedWidth(w / 5) self.width_size_seter_label.setFixedWidth(w / 10) self.height_size_seter_label.setFixedWidth(w / 10) self.width_size_seter.setMinimumWidth(w / 20) self.height_size_seter.setMinimumWidth(w / 20) self.Right_size_seter_label.setFixedWidth(w / 10) self.Left_size_seter_label.setFixedWidth(w / 10) self.Up_size_seter_label.setFixedWidth(w / 10) self.Down_size_seter_label.setFixedWidth(w / 10) self.Right_size_seter.setFixedWidth(w / 20) self.Left_size_seter.setFixedWidth(w / 20) self.Up_size_seter.setFixedWidth(w / 20) self.Down_size_seter.setFixedWidth(w / 20) def Read(self, inpoints): points = [] for i in inpoints: points.append(i.split()) result = [] for i in points: for l in range(len(i)): a = float((i[l].split(','))[0]) a = a * self.x_scale b = float((i[l].split(','))[1]) b = (self.height_load - b) * self.y_scale result.append((a, b)) return (result) def Load(self): fileName, filetype = QFileDialog.getOpenFileName( self, '选取文件', '~/', 'PNG Files (*.png);;JPG Files (*.jpg);;SVG Files (*.svg)' ) # 设置文件扩展名过滤,注意用双分号间隔 print(fileName, '\t', filetype) if len(fileName) > 0: self.FlagLoaded = True if ('svg' in fileName): self.TypeLoaded = 'svg' doc = minidom.parse(fileName) # parseString also exists polygon_points = [ path.getAttribute('points') for path in doc.getElementsByTagName('polygon') ] polyline_points = [ path.getAttribute('points') for path in doc.getElementsByTagName('polyline') ] svg_width = [ path.getAttribute('width') for path in doc.getElementsByTagName('svg') ] svg_height = [ path.getAttribute('height') for path in doc.getElementsByTagName('svg') ] # print(svg_width) # print(svg_height) digit = '01234567890.-' width = svg_width[0].replace('px', '').replace('pt', '') height = svg_height[0].replace('px', '').replace('pt', '') self.width_load = float(width) self.height_load = float(height) soup = BeautifulSoup(open(fileName), 'lxml') tmpgon = soup.find_all('polygon') tmppolyline = soup.find_all('polyline') tmptext = soup.find_all('text') tmpline = soup.find_all('line') tmppath = soup.find_all('path') self.strgons = [] for i in tmpgon: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.polygon.attrs self.strgons.append(k['points'].split()) self.strpolylines = [] for i in tmppolyline: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.polyline.attrs self.strpolylines.append(k['points'].split()) self.strlines = [] for i in tmpline: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.line.attrs a = str(k['x1']) + ',' + str(k['y1']) + ' ' + str( k['x2']) + ',' + str(k['y2']) self.strlines.append(a.split()) self.strpath = [] for i in tmppath: a = (str(i)).replace('\n', '').replace('\t', '') m = BeautifulSoup(a, 'lxml') k = m.path.attrs self.strpath.append(k['d'].split()) # print(self.strpath) self.polygon = [] for i in self.strgons: m = self.Read(i) m.append(m[0]) self.polygon.append(m) self.polyline = [] for i in self.strpolylines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.polyline.append(m) self.line = [] for i in self.strlines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.line.append(m) elif ('png' in fileName or 'jpg' in fileName): self.TypeLoaded = 'png' self.img = mpimg.imread(fileName) self.flag = 1 self.Magic() def Unload(self): self.flag = 0 self.FlagLoaded = False self.TypeLoaded = '' self.Magic() def WChanged(self, text): try: self.width_plot = float(text) except: pass self.x_scale = self.width_plot / self.width_load self.polygon = [] for i in self.strgons: m = self.Read(i) m.append(m[0]) self.polygon.append(m) self.polyline = [] for i in self.strpolylines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.polyline.append(m) self.line = [] for i in self.strlines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.line.append(m) self.Magic() def HChanged(self, text): try: self.height_plot = float(text) except: pass self.y_scale = self.height_plot / self.height_load self.polygon = [] for i in self.strgons: m = self.Read(i) m.append(m[0]) self.polygon.append(m) self.polyline = [] for i in self.strpolylines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.polyline.append(m) self.line = [] for i in self.strlines: m = self.Read(i) # print('i: ',i,'\n m:',m) self.line.append(m) self.Magic() # text_location= [path.getAttribute('transform') for path in doc.getElementsByTagName('text')] ''' tmppolygon_points=[] for i in polygon_points: tmppolygon_points.append(i.split()) polygon=[] for i in tmppolygon_points: for l in range(len(i)): a=float((i[l].split(','))[0]) b=float((i[l].split(','))[1]) polygon.append([a,b]) ''' def LeftChanged(self, text): try: self.Left = float(text) except: pass self.Magic() def RightChanged(self, text): try: self.Right = float(text) except: pass self.Magic() def UpChanged(self, text): try: self.Up = float(text) except: pass self.Magic() def DownChanged(self, text): try: self.Down = float(text) except: pass self.Magic() def FitChanged(self, text): try: self.FitLevel = float(text) except: pass self.Magic() def ShapeChanged(self, text): w = 'Shape' + text self.shape_label.setText(w) self.shape_label.adjustSize() try: self.ShapeGroups = int(text) except: pass self.Magic() def LabelSeter(self): self.LabelSetted = True self.ValueChoosed = False self.Magic() def ValueChooser(self): self.LabelSetted = False self.ValueChoosed = True self.Magic() def Magic(self): self.WholeData = [] self.x_scale = self.width_plot / self.width_load self.y_scale = self.height_plot / self.height_load # print(self.x_scale,' and ',self.x_scale) raw = self._df dataframe = self._df ItemsAvalibale = self._df.columns.values.tolist() ItemsToTest = [ 'Number', 'Tag', 'Name', 'Author', 'DataType', 'Marker', 'Color', 'Size', 'Alpha', 'Style', 'Width', 'Label' ] for i in ItemsToTest: if i in ItemsAvalibale: dataframe = dataframe.drop(i, 1) ItemsAvalibale = dataframe.columns.values.tolist() a = int(self.x_element.value()) b = int(self.y_element.value()) if self.LabelSetted == True: if (self.x_seter.text() != ''): try: a = int(self.x_seter.text()) except (ValueError): atmp = self.x_seter.text() try: if atmp in ItemsAvalibale: a = ItemsAvalibale.index(atmp) #print(a) except (ValueError): pass pass self.x_element.setValue(a) else: a = int(self.x_element.value()) if (self.y_seter.text() != ''): try: b = int(self.y_seter.text()) except (ValueError): btmp = self.y_seter.text() try: if btmp in ItemsAvalibale: b = ItemsAvalibale.index(btmp) #print(b) except (ValueError): pass pass self.y_element.setValue(b) else: b = int(self.y_element.value()) if b > len(ItemsAvalibale) - 1: b = int(self.y_element.value()) if a > len(ItemsAvalibale) - 1: a = int(self.x_element.value()) if self.ValueChoosed == True: a = int(self.x_element.value()) b = int(self.y_element.value()) self.x_seter.setText(ItemsAvalibale[a]) self.y_seter.setText(ItemsAvalibale[b]) self.axes.clear() if (self.Left != self.Right) and ( self.Down != self.Up) and abs(self.Left) + abs( self.Right) + abs(self.Down) + abs(self.Up) != 0: self.extent = [self.Left, self.Right, self.Down, self.Up] elif (self.Left == self.Right and abs(self.Left) + abs(self.Right) != 0): reply = QMessageBox.warning( self, 'Warning', 'You set same value to Left and Right limits.') self.extent = 0 elif (self.Down == self.Up and abs(self.Down) + abs(self.Up) != 0): reply = QMessageBox.warning( self, 'Warning', 'You set same value to Up and Down limits.') self.extent = 0 else: self.extent = 0 slider_value = int(self.standard_slider.value()) if slider_value < len(self.StandardsName): standardnamechosen = self.StandardsName[slider_value] standardchosen = self.Standards[standardnamechosen] right_label_text = self.StandardsName[slider_value] elif len(self._given_Standard) <= 0: standardnamechosen = self.StandardsName[slider_value - 1] standardchosen = self.Standards[standardnamechosen] right_label_text = self.StandardsName[slider_value - 1] else: standardnamechosen = "Self Defined Standard" standardchosen = self._given_Standard right_label_text = "Self Defined Standard" self.right_label.setText(right_label_text) if self.flag != 0: if self.extent != 0: self.axes.imshow(self.img, interpolation='nearest', aspect='auto', extent=self.extent) else: self.axes.imshow(self.img, interpolation='nearest', aspect='auto') self.axes.set_xlabel(ItemsAvalibale[a]) self.axes.set_ylabel(ItemsAvalibale[b]) PointLabels = [] XtoFit = [] YtoFit = [] for i in range(len(raw)): # raw.at[i, 'DataType'] == 'User' or raw.at[i, 'DataType'] == 'user' or raw.at[i, 'DataType'] == 'USER' TmpLabel = '' # self.WholeData.append(math.log(tmp, 10)) if (raw.at[i, 'Label'] in PointLabels or raw.at[i, 'Label'] == ''): TmpLabel = '' else: PointLabels.append(raw.at[i, 'Label']) TmpLabel = raw.at[i, 'Label'] if pd.isnull(dataframe.at[i, self.items[a]]) or pd.isnull( dataframe.at[i, self.items[b]]): pass else: #if dataframe.at[i, self.items[a]]!='nan' and dataframe.at[i, self.items[b]]!='nan': x, y = dataframe.at[i, self.items[a]], dataframe.at[i, self.items[b]] if pd.isnull(x) or pd.isnull(y): self.ContainNan = True pass else: try: xuse = x yuse = y self.xlabel = self.items[a] self.ylabel = self.items[b] if (self.norm_cb.isChecked()): self.sentence = self.reference if self.items[a] in self.Element: self.xlabel = self.items[ a] + ' Norm by ' + standardnamechosen xuse = xuse / standardchosen[self.items[a]] if self.items[b] in self.Element: self.ylabel = self.items[ b] + ' Norm by ' + standardnamechosen yuse = yuse / standardchosen[self.items[b]] if (self.logx_cb.isChecked()): xuse = math.log(x, 10) newxlabel = '$log10$( ' + self.xlabel + ')' self.axes.set_xlabel(newxlabel) else: self.axes.set_xlabel(self.xlabel) if (self.logy_cb.isChecked()): yuse = math.log(y, 10) newylabel = '$log10$( ' + self.ylabel + ')' self.axes.set_ylabel(newylabel) else: self.axes.set_ylabel(self.ylabel) self.axes.scatter(xuse, yuse, marker=raw.at[i, 'Marker'], s=raw.at[i, 'Size'], color=raw.at[i, 'Color'], alpha=raw.at[i, 'Alpha'], label=TmpLabel, edgecolors='black') XtoFit.append(xuse) YtoFit.append(yuse) except (ValueError): pass #Yline = np.linspace(min(YtoFit), max(YtoFit), 30) ResultStr = '' BoxResultStr = '' Paralist = [] #print(XtoFit, '\n', YtoFit) if len(XtoFit) != len(YtoFit): reply = QMessageBox.information( self, 'Warning', 'Your Data X and Y have different length!') pass fitstatus = True if (int(self.fit_slider.value()) == 0): if len(XtoFit) > 0: Xline = np.linspace(min(XtoFit), max(XtoFit), 30) try: np.polyfit(XtoFit, YtoFit, self.FitLevel) except (): fitstatus = False pass if (fitstatus == True): opt, cov = np.polyfit(XtoFit, YtoFit, self.FitLevel, cov=True) self.fit_slider_label.setText('y= f(x) EXP') p = np.poly1d(opt) Yline = p(Xline) formular = 'y= f(x):' sigma = np.sqrt(np.diag(cov)) N = len(XtoFit) F = N - 2 MSWD = 1 + 2 * np.sqrt(2 / F) MSWDerr = np.sqrt(2 / F) for i in range(int(self.FitLevel + 1)): Paralist.append([opt[i], sigma[i]]) if int(self.fit_slider.value()) == 0: if (self.FitLevel - i == 0): ResultStr = ResultStr + str( opt[i]) + '$\pm$' + str(sigma[i]) + '+' BoxResultStr = BoxResultStr + str( opt[i]) + '±' + str(sigma[i]) + '\n' else: ResultStr = ResultStr + str( opt[i]) + '$\pm$' + str( sigma[i]) + '$x^' + str(self.FitLevel - i) + '$' + '+' BoxResultStr = BoxResultStr + str( opt[i]) + '±' + str( sigma[i]) + 'x^' + str(self.FitLevel - i) + '+\n' elif (int(self.fit_slider.value()) == 1): if (self.FitLevel - i == 0): ResultStr = ResultStr + str( opt[i]) + '$\pm$' + str(sigma[i]) + '+' BoxResultStr = BoxResultStr + str( opt[i]) + '±' + str(sigma[i]) + '+\n' else: ResultStr = ResultStr + str( opt[i]) + '$\pm$' + str( sigma[i]) + '$y^' + str(self.FitLevel - i) + '$' + '+' BoxResultStr = BoxResultStr + str( opt[i]) + '±' + str( sigma[i]) + 'y^' + str(self.FitLevel - i) + '+\n' pass pass self.textbox.setText(formular + '\n' + BoxResultStr + '\n MSWD(±2σ)' + str(MSWD) + '±' + str(2 * MSWDerr) + '\n' + self.sentence) if (self.fit_cb.isChecked()): self.axes.plot(Xline, Yline, 'b-') elif (int(self.fit_slider.value()) == 1): if len(YtoFit) > 0: Yline = np.linspace(min(YtoFit), max(YtoFit), 30) try: np.polyfit(YtoFit, XtoFit, self.FitLevel, cov=True) except (ValueError, TypeError): fitstatus = False pass if (fitstatus == True): opt, cov = np.polyfit(YtoFit, XtoFit, self.FitLevel, cov=True) self.fit_slider_label.setText('x= f(x) EXP') p = np.poly1d(opt) Xline = p(Yline) formular = 'x= f(y):' sigma = np.sqrt(np.diag(cov)) N = len(XtoFit) F = N - 2 MSWD = 1 + 2 * np.sqrt(2 / F) MSWDerr = np.sqrt(2 / F) for i in range(int(self.FitLevel + 1)): Paralist.append([opt[i], sigma[i]]) if int(self.fit_slider.value()) == 0: if (self.FitLevel - i == 0): ResultStr = ResultStr + str( opt[i]) + '$\pm$' + str(sigma[i]) + '+' BoxResultStr = BoxResultStr + str( opt[i]) + '±' + str(sigma[i]) + '\n' else: ResultStr = ResultStr + str( opt[i]) + '$\pm$' + str( sigma[i]) + '$x^' + str(self.FitLevel - i) + '$' + '+' BoxResultStr = BoxResultStr + str( opt[i]) + '±' + str( sigma[i]) + 'x^' + str(self.FitLevel - i) + '+\n' elif (int(self.fit_slider.value()) == 1): if (self.FitLevel - i == 0): ResultStr = ResultStr + str( opt[i]) + '$\pm$' + str(sigma[i]) + '+' BoxResultStr = BoxResultStr + str( opt[i]) + '±' + str(sigma[i]) + '+\n' else: ResultStr = ResultStr + str( opt[i]) + '$\pm$' + str( sigma[i]) + '$y^' + str(self.FitLevel - i) + '$' + '+' BoxResultStr = BoxResultStr + str( opt[i]) + '±' + str( sigma[i]) + 'y^' + str(self.FitLevel - i) + '+\n' pass pass self.textbox.setText(formular + '\n' + BoxResultStr + '\n MSWD(±2σ)' + str(MSWD) + '±' + str(2 * MSWDerr) + '\n' + self.sentence) if (self.fit_cb.isChecked()): self.axes.plot(Xline, Yline, 'b-') if (self.shape_cb.isChecked()): if XtoFit != YtoFit: xmin, xmax = min(XtoFit), max(XtoFit) ymin, ymax = min(YtoFit), max(YtoFit) DensityColorMap = 'Blues' DensityAlpha = 0.3 DensityLineColor = 'grey' DensityLineAlpha = 0.3 # Peform the kernel density estimate xx, yy = np.mgrid[xmin:xmax:200j, ymin:ymax:200j] #print(self.ShapeGroups) #command='''xx, yy = np.mgrid[xmin:xmax:'''+str(self.ShapeGroups)+ '''j, ymin:ymax:''' +str(self.ShapeGroups)+'''j]''' #exec(command) #print(xx, yy) positions = np.vstack([xx.ravel(), yy.ravel()]) values = np.vstack([XtoFit, YtoFit]) kernelstatus = True try: st.gaussian_kde(values) except (): kernelstatus = False if kernelstatus == True: kernel = st.gaussian_kde(values) f = np.reshape(kernel(positions).T, xx.shape) # Contourf plot cfset = self.axes.contourf(xx, yy, f, cmap=DensityColorMap, alpha=DensityAlpha) ## Or kernel density estimate plot instead of the contourf plot #self.axes.imshow(np.rot90(f), cmap='Blues', extent=[xmin, xmax, ymin, ymax]) # Contour plot cset = self.axes.contour(xx, yy, f, colors=DensityLineColor, alpha=DensityLineAlpha) # Label plot self.axes.clabel(cset, inline=1, fontsize=10) if self.TypeLoaded == 'svg': if self.polygon != 0 and self.polyline != 0 and self.line != 0: # print('gon: ',self.polygon,' \n line:',self.polyline) for i in self.polygon: self.DrawLine(i) for i in self.polyline: self.DrawLine(i) for i in self.line: self.DrawLine(i) # self.DrawLine(self.polygon) # self.DrawLine(self.polyline) if (self.legend_cb.isChecked()): self.axes.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0, prop=fontprop) self.canvas.draw() def stateval(self, data=np.ndarray): dict = { 'mean': mean(data), 'ptp': ptp(data), 'var': var(data), 'std': std(data), 'cv': mean(data) / std(data) } return (dict) def relation(self, data1=np.ndarray, data2=np.ndarray): data = array([data1, data2]) dict = {'cov': cov(data, bias=1), 'corrcoef': corrcoef(data)} return (dict) def Stat(self): df = self._df m = ['Width', 'Style', 'Alpha', 'Size', 'Color', 'Marker', 'Author'] for i in m: if i in df.columns.values: df = df.drop(i, 1) df.set_index('Label', inplace=True) items = df.columns.values index = df.index.values StatResultDict = {} for i in items: StatResultDict[i] = self.stateval(df[i]) StdSortedList = sorted(StatResultDict.keys(), key=lambda x: StatResultDict[x]['std']) StdSortedList.reverse() ''' for k in sorted(StatResultDict.keys(), key=lambda x: StatResultDict[x]['std']): print("%s=%s" % (k, StatResultDict[k])) ''' StatResultDf = pd.DataFrame.from_dict(StatResultDict, orient='index') StatResultDf['Items'] = StatResultDf.index.tolist() self.tablepop = TabelViewer(df=StatResultDf, title='Statistical Result') self.tablepop.show() self.Intro = StatResultDf return (StatResultDf)