Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    def Explain(self):

        #self.OutPutData = self.OutPutData.set_index('Label')

        self.tablepop = TabelViewer(df=self.OutPutData, title='TAS Result')
        self.tablepop.show()
Example #4
0
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()
Example #5
0
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()
Example #6
0
    def Explain(self):

        #self.OutPutData = self.OutPutData.set_index('Label')

        self.tablepop = TabelViewer(df=self.OutPutData,title='TAS Result')
        self.tablepop.show()
Example #7
0
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()
Example #8
0
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)
Example #9
0
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)
Example #10
0
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)