VB_Learner Ответов: 1

Как сортировать (мин и Макс) Оси X и Y диаграммы в VB .NET 2010


Я читаю текстовый файл и строю точки на диаграмме. Файл содержит произвольно расположенные числа в Столбцах. Изначально программа получает минимальные и максимальные числа из столбцов в соответствии с моим требованием. После этого я помещаю их на диаграмму, но оси X и Y не сортируются. Ось показывает случайные числа, а не отсортированные значения (от min до max).
До сих пор то, что я пробовал, скопировано ниже.
Пожалуйста, научите меня, как изменить цвет и размер точек на графике, чтобы дифференцировать их, так как позже мне придется загружать несколько файлов.

Заранее спасибо !!!

Что я уже пробовал:

Dim Textfile As String
        Dim openDlg As New OpenFileDialog

        If openDlg.ShowDialog() = DialogResult.OK Then
            openDlg.Filter = "txt files (*.txt)| *.txt|All files (*.*)|*.*"
            openDlg.FilterIndex = 2
            openDlg.RestoreDirectory = True
            Textfile = openDlg.FileName

            Dim filelines() As String = File.ReadAllLines(Textfile)

            Dim col1 As List(Of Long) = New List(Of Long)()
            Dim col2 As List(Of Long) = New List(Of Long)()
            Dim col3 As List(Of Double) = New List(Of Double)()
            Dim col4 As List(Of Double) = New List(Of Double)()

            Chart1.Series.Clear()
            Dim r As New Series
            r.Name = "Receivers"
            r.ChartType = SeriesChartType.Point
            Chart1.Series.Add(r)

            For Each fileline As String In filelines
                If fileline.StartsWith("R") Then fileline = fileline.Substring(1)
                Dim items() As String = fileline.Split(New Char() {CChar(vbTab), " "}, StringSplitOptions.RemoveEmptyEntries)

                Dim Linenum As Long
                Dim statnum As Double
                Dim Easting As Double
                Dim Northing As Double

                If Integer.TryParse(items(0), Linenum) Then col1.Add(Linenum)
                If Integer.TryParse(items(1), statnum) Then col2.Add(statnum)
                If Double.TryParse(items(2), Easting) Then col3.Add(Easting)
                If Double.TryParse(items(3), Northing) Then col4.Add(Northing)

                r.Points.AddXY(items(2), items(3))
                
               
            Next

            'sorting the columns to get min and max
            col1.Sort()
            col2.Sort()
            col3.Sort()
            col4.Sort()
            
            'getting maximum and minimum value of 4 columns
            Me.Linemax.Text = col1.Item(col1.Count - 1).ToString()
            Me.Linemin.Text = col1.Item(0).ToString()
            Me.statemax.Text = col2.Item(col2.Count - 1).ToString()
            Me.statmin.Text = col2.Item(0).ToString()
            Me.Eastmax.Text = col3.Item(col3.Count - 1).ToString()
            Me.Eastmin.Text = col3.Item(0).ToString()
            Me.Northmax.Text = col4.Item(col4.Count - 1).ToString()
            Me.Northmin.Text = col4.Item(0).ToString()


            'restricted Y axis as per the maximum and minimum values in the column
            Chart1.ChartAreas(0).AxisY.Minimum = col4.Item(0).ToString()
            Chart1.ChartAreas(0).AxisY.Maximum = col4.Item(col4.Count - 1).ToString()
            

        End If
    End Sub

Ralf Meier

Опубликуйте некоторые реальные значения из одного из ваших файлов ... В данный момент я понятия не имею, в чем ваша проблема ...

VB_Learner

Привет Ральф,

Пример данных примерно таков ..

194787.5 2667200.0
194812.5 2667200.0
195662.5 2667200.0
195687.5 2667200.0
201937.5 2667350.0
195737.5 2667200.0
195762.5 2667200.0
195787.5 2667200.0
196512.5 2667200.0
201837.5 2667350.0
198562.5 2667650.0
201887.5 2667350.0
201912.5 2667350.0
198187.5 2667500.0
201962.5 2667350.0
201987.5 2667350.0
202012.5 2667350.0
198412.5 2667650.0

Ralf Meier

Спасибо... теперь у меня есть другие вопросы ...
В вашем примере показан список с X - и Y-значениями - это будут два 1D-массива или один 2D-массив.
Таким образом, у вас будут все значения X в col1 и все значения Y в col2 ...?
В вашем фрагменте кода у вас есть 4 коллекции - что это значит ? Различные Кривые ?
Я предполагаю, что Xmin будет col1(0), а Xmax-col1(col1.Граф - 1) - то же, для г : Ymin будет столбец col2(0) и ymax будет столбец col2(столбец col2.Граф - 1) ... но вы назначаете col4 - что это значит ? Пожалуйста объяснить ...

VB_Learner

Да, есть 4 колонки.. Я только отправил пример 2 столбцов, которые я строю.. первые 2 столбца-это просто целые числа, которые я пока не хочу строить. Я только хочу, чтобы эти два столбца строились как точки ... Я сталкиваюсь только с проблемой сортировки оси X - Y диаграммы, чтобы начать с Min до Max .. надеюсь, вы поняли мою точку зрения..

Ralf Meier

ОК... но это то, что вы все уже делаете - так какая часть не работает до сих пор ?

VB_Learner

Я полагаю, что вы нанесли данные на график.. можете ли вы видеть, что оси X находятся в порядке возрастания?? .. мой вопрос связан с сортировкой осей X и Y, что они не сортируются от min до max ... пожалуйста, постройте график данных и посмотрите ... есть ли какой-нибудь способ прикрепить изображение jpg, чтобы прояснить мою проблему??

Ralf Meier

Мне кажется, теперь я понимаю - вот мое решение ...

VB_Learner

Спасибо за ваши усилия.. но, к сожалению, это решение будет работать только в том случае, если у меня есть ограниченные строки (10-20). Мой исходный файл содержит 5000 строк, и это решение точно не будет работать. Я скопировал все 4 столбца ниже. Пожалуйста, запустите мой оригинальный код, который я разместил в вопросе,и посмотрите на ось X. Вы обнаружите, что ось X диаграммы не отсортирована для представления графика. например, если график начинается с 0 - 10, интервал в моем графике показывает 0-1-2-5-6-4-7-9-8-3 и т. д.
R2072 2193 194787.5 2667200.0
R2072 2194 194812.5 2667200.0
R2072 2195 195662.5 2667200.0
R2072 2196 195687.5 2667200.0
R2072 2197 201937.5 2667350.0
R2072 2198 195737.5 2667200.0
R2072 2199 195762.5 2667200.0
R2072 2200 195787.5 2667200.0
R2072 2201 196512.5 2667200.0
R2072 2202 201837.5 2667350.0
R2072 2203 198562.5 2667650.0
R2072 2204 201887.5 2667350.0
R2072 2205 201912.5 2667350.0
R2072 2206 198187.5 2667500.0
R2072 2207 201962.5 2667350.0
R2072 2208 201987.5 2667350.0
R2072 2209 202012.5 2667350.0

Ralf Meier

В данный момент я ничего не понимаю.
В моем фрагменте кода я работал с прямым присвоением значений спискам, потому что у меня нет вашего файла.
В основном (для разнесенного кода) нет разницы, есть ли у вас 18 строк значений или 5000-вам нужно только больше времени для сортировки и назначения на диаграмму.
Ваша основная проблема в вашем коде (как я уже писал в своем решении) заключается в том, что вы всегда назначаете строки тем свойствам диаграммы, которые ожидают числовых значений-в этом разница между вашим кодом и моим - я назначаю двойные значения ... либо к масштабированию диаграммы, но также и к точкам диаграммы.

Но... что вы имеете в виду, говоря: "интервал на моем графике показывает 0-1-2-5-6-4-7-9-8-3 и т. д."? Я этого не понимаю.

1 Ответов

Рейтинг:
2

Ralf Meier

ОК... Я сделал некоторые тесты с вашими данными и вашим кодом.
По крайней мере, некоторые изменения там, где это необходимо. Я думаю, что с помощью моего метода-образца вам будет легко изменить свой код, чтобы он работал.

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim col3 As New List(Of Double)
        Dim col4 As New List(Of Double)
        Dim Easting As Double
        Dim Northing As Double

        Dim s(17) As String
        Dim item As String()
        s(0) = "194787.5 2667200.0"
        s(1) = "194812.5 2667200.0"
        s(2) = "195662.5 2667200.0"
        s(3) = "195687.5 2667200.0"
        s(4) = "201937.5 2667350.0"
        s(5) = "195737.5 2667200.0"
        s(6) = "195762.5 2667200.0"
        s(7) = "195787.5 2667200.0"
        s(8) = "196512.5 2667200.0"
        s(9) = "201837.5 2667350.0"
        s(10) = "198562.5 2667650.0"
        s(11) = "201887.5 2667350.0"
        s(12) = "201912.5 2667350.0"
        s(13) = "198187.5 2667500.0"
        s(14) = "201962.5 2667350.0"
        s(15) = "201987.5 2667350.0"
        s(16) = "202012.5 2667350.0"
        s(17) = "198412.5 2667650.0"

        For i As Integer = 0 To 17
            item = Split(s(i), " ")

            Easting = CDbl(item(0))
            Northing = CDbl(item(1))

            col3.Add(Easting)
            col4.Add(Northing)

            Chart1.Series(0).Points.AddXY(Easting, Northing)
        Next

        col3.Sort()
        col4.Sort()

        Chart1.ChartAreas(0).AxisX.Minimum = col3.Item(0)
        Chart1.ChartAreas(0).AxisX.Maximum = col3.Item(col3.Count - 1)
        Chart1.ChartAreas(0).AxisY.Minimum = col4.Item(0)
        Chart1.ChartAreas(0).AxisY.Maximum = col4.Item(col4.Count - 1)

    End Sub


На мой взгляд, ваша основная ошибка заключалась в том, что вы все время добавляли строки в качестве границ диаграммы, а также в качестве точек диаграммы.