Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
vova_king
24 / 24 / 9
Регистрация: 29.07.2010
Сообщений: 261
#1

Построение графика по данным из БД

17.04.2016, 15:25. Просмотров 748. Ответов 15
Метки нет (Все метки)

Доброе время суток, знатоки!
Есть данные которые берутся из базу
100 - 01.04.2016
30 - 02.04.2016
50 - 03.04.2016
и т.д.
Как построить примитивный график для отображения данных взятых из базы?
что то на подобии этого как на картинке?
0
Миниатюры
Построение графика по данным из БД  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2016, 15:25
Ответы с готовыми решениями:

Построение графика по исходным данным
Зделал интерфейс из 3х закладок. На первом вводятся исходные данные (координаты...

Построение графиков по отобранным данным
Здравствуйте!Нужна ваша помощь. Есть таблица, к таблице создал процедуру для...

Построение точек в ZedGraph, по данным из DataGridView
Снова добрый вечер, друзья. Вопрос - как задать в ZedGraph, чтобы точки...

Вывод графика в Chart по данным из таблицы БД
Здравствуйте!!! Столкнулся с проблемой вывода графика по таблице(VB 2012)....

Построение графика
Имеется одномерный массив, заполненный случайными значениями в диапазоне от 1...

15
Памирыч
Почетный модератор
20866 / 8750 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
17.04.2016, 15:35 #2
Лучший ответ Сообщение было отмечено edward_freedom как решение

Решение

Попробуйте разобрать пример.
На форме PictureBox и таймер

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    Dim Pts As New List(Of Point)
    Dim R As New Random
    Dim Cnt As Integer
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox1.Refresh()
    End Sub
 
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
 
        CorelDraw(e)
        If Pts.Count > 2 Then
            e.Graphics.DrawCurve(Pens.Red, Pts.ToArray)
        End If
 
        If Pts.Count < 23 Then
            Pts.Add(New Point(Cnt * 20 + 20, 380 - R.Next(0, 300)))
            Cnt += 1
        End If
        For Each P As Point In Pts
            e.Graphics.DrawString(P.X - 20 & "x" & 380 - P.Y, New Font("Arial", 8), Brushes.Black, P.X - 25, P.Y - 15)
            e.Graphics.FillEllipse(Brushes.Orange, New Rectangle(P.X - 2, P.Y - 2, 4, 4))
        Next
 
    End Sub
 
    Sub CorelDraw(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 20, 400)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 15, 20)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 25, 20)
        e.Graphics.DrawLine(Pens.Blue, 5, 380, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 375, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 385, 500, 380)
        For I As Integer = 20 To 450 Step 20 'X
            e.Graphics.DrawLine(Pens.Blue, I, 377, I, 383)
        Next
        For I As Integer = 380 To 30 Step -20 'Y
            e.Graphics.DrawLine(Pens.Blue, 17, I, 23, I)
        Next
    End Sub
Может, что-то натолкнет Вас на мысли
2
Миниатюры
Построение графика по данным из БД  
vova_king
24 / 24 / 9
Регистрация: 29.07.2010
Сообщений: 261
17.04.2016, 16:57  [ТС] #3
Цитата Сообщение от Памирыч Посмотреть сообщение
Попробуйте разобрать пример.
Как я понял делает рандомно
vb.net
1
Dim R As New Random
Но как каждый раз вставлять данные в переменную R (которая не будет рандомной) нужный параметр в строку:
vb.net
1
Pts.Add(New Point(Cnt * 20 + 20, 380 - R.Next(0, 300)))
0
Памирыч
Почетный модератор
20866 / 8750 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
17.04.2016, 17:49 #4
vova_king, так пример и дан для разбора, экспериментируйте
1
vova_king
24 / 24 / 9
Регистрация: 29.07.2010
Сообщений: 261
18.04.2016, 09:50  [ТС] #5
Цитата Сообщение от Памирыч Посмотреть сообщение
экспериментируйте
поэкспериментировал, разобрался (до 1 ночи сидел разбирался), только вот бы теперь разобраться, как тест (дат) перевернуть под -90градусов
0
Миниатюры
Построение графика по данным из БД  
vova_king
24 / 24 / 9
Регистрация: 29.07.2010
Сообщений: 261
18.04.2016, 12:58  [ТС] #6
Если использовать
vb.net
1
e.graphis.rotatetransform (45)
все плящет по разным местам picturebox
0
Памирыч
Почетный модератор
20866 / 8750 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
18.04.2016, 14:07 #7
Цитата Сообщение от vova_king Посмотреть сообщение
все плящет по разным местам picturebox
Разумеется, Вы же поворачиваете весь холст.
Графику надо повернуть, подписать оси и повернуть обратно, как было.

Процедура CorelDraw слегка изменится
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    Sub CorelDraw(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 20, 400)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 15, 20)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 25, 20)
        e.Graphics.DrawLine(Pens.Blue, 5, 380, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 375, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 385, 500, 380)
 
        For I As Integer = 20 To 450 Step 20 'X
            e.Graphics.DrawLine(Pens.Green, I, 377, I, 383)
        Next
 
        'Подписи в 90 град.
        e.Graphics.RotateTransform(-90)
        e.Graphics.TranslateTransform(-512, 14)
        For I As Integer = 20 To 430 Step 20
            e.Graphics.DrawString(I, Me.Font, Brushes.Black, 100, I)
        Next
        e.Graphics.TranslateTransform(512, -14)
        e.Graphics.RotateTransform(90)
        '// подписи
 
        For I As Integer = 380 To 30 Step -20
            e.Graphics.DrawLine(Pens.Blue, 17, I, 23, I)
        Next
    End Sub
1
Миниатюры
Построение графика по данным из БД  
ovva
2349 / 1991 / 486
Регистрация: 02.02.2013
Сообщений: 1,848
Записей в блоге: 2
18.04.2016, 19:17 #8
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Если построение графика не является самоцелью, то логичнее использовать компонент MSChart (или другой подобный).
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    With Chart1
        .DataSource = tb 'таблица, три поля: ID, tstValue, tstDate
        .Series(0).XValueMember = "tstDate"
        .Series(0).XValueType = DataVisualization.Charting.ChartValueType.Date
        .Series(0).YValueMembers = "tstValue"
        .Series(0).ChartType = DataVisualization.Charting.SeriesChartType.Line
        .Series(0).Color = Color.Red
        .Series(0).IsValueShownAsLabel = True
        .Series(0).IsVisibleInLegend = False
        .ChartAreas(0).AxisX.Interval = 1
        .Show()
    End With
End Sub
3
Миниатюры
Построение графика по данным из БД  
vova_king
24 / 24 / 9
Регистрация: 29.07.2010
Сообщений: 261
19.04.2016, 18:29  [ТС] #9
Цитата Сообщение от ovva Посмотреть сообщение
MSChart
а если у меня не используется DGV, как в таком случаи применять datasource?

Добавлено через 20 минут
В примере который показал Памирыч
я сделал так:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 '------------ постороение графика --------------------------------
    Dim Pts As New List(Of Point)
    Dim Dts As New List(Of String)
    Dim R As New Random
    Dim Cnt As Integer
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox7.Refresh()
    End Sub
 
    Private Sub PictureBox7_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox7.Paint
        CorelDraw(e)
        If Pts.Count > 1 Then
            e.Graphics.DrawCurve(Pens.Orange, Pts.ToArray) ' цвет построения линии
        End If
        For Each P As Point In Pts
            e.Graphics.FillEllipse(Brushes.Red, New Rectangle(P.X - 2, P.Y - 2, 4, 4)) ' пишет точки 
        Next
    End Sub
    '================================== подсчет для графика ====================================
    ' функция для отображения осей координат
    Sub CorelDraw(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 20, 400)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 15, 20)
        e.Graphics.DrawLine(Pens.Blue, 20, 10, 25, 20)
        e.Graphics.DrawLine(Pens.Blue, 5, 380, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 375, 500, 380)
        e.Graphics.DrawLine(Pens.Blue, 490, 385, 500, 380)
        For I As Integer = 20 To 450 Step 20 'X
            e.Graphics.DrawLine(Pens.DarkCyan, I, 377, I, 383)
        Next
        For I As Integer = 0 To 300 Step 20 'Y
            e.Graphics.DrawLine(Pens.Blue, 17, I, 23, I)
            e.Graphics.DrawString(300 - I, New Font("time new roman", 8), Brushes.Blue, 0, I - 4)
        Next
        Dim cnt As Integer = 25
        For Each D As String In Dts
            e.Graphics.DrawString(D, New Font("Arial", 8), Brushes.Blue, cnt, 380)
            cnt += 20
        Next    
    End Sub
    Private Sub Button44_Click(sender As Object, e As EventArgs) Handles Button44.Click
        PictureBox7.Location = New Point(2, 3)
                Dim D = DateTime.Today  ' получаем текущию дату
        Dim Dp = D.ToString("MM.yyyy", CultureInfo.InvariantCulture) ' преобразовываем текущую дату в нужный формат месяц-год
        Label27.Text = Dp
        sqConnection.Open() '
        Dim pdp As Integer
        Dim command As SQLiteCommand = New SQLiteCommand("select COUNT(DISTINCT `dat`) from Se where dat like '%" & Dp & "';", sqConnection)
        Dim reader As SQLiteDataReader = command.ExecuteReader()
        If reader.HasRows Then
            Do While reader.Read()
                pdp = reader.GetInt32(0)
            Loop
        Else : Console.WriteLine("noy")
        End If
        reader.Close()
        For i = 0 To pdp
            Dim di = DateTime.Today
            Dim diu = di.ToString("dd", CultureInfo.InvariantCulture)
            Dim newdat = D.AddDays(-i).ToString.Replace(" 0:00:00", "")
            Console.WriteLine(newdat)
            Dim command1 As SQLiteCommand = New SQLiteCommand("select COUNT(DISTINCT `namess`) from Se where dat = '" & newdat & "';", sqConnection)
            Dim reader1 As SQLiteDataReader = command1.ExecuteReader()
            If reader1.HasRows Then
               Do While reader1.Read()
                    Dim pdp1 = reader1.GetInt32(0)
                    If Pts.Count < pdp Then
                        Pts.Add(New Point(Cnt * 20 + 20, 300 - pdp1))
                        Dts.Add(newdat)
                        Cnt += 1
                    End If
                    Console.WriteLine(pdp1)
                Loop
            Else : Console.WriteLine("noy")
            End If
            reader1.Close()
        Next
        sqConnection.Close()
        PictureBox7.Refresh()
        PictureBox7.Visible = True
    End Sub
0
vova_king
24 / 24 / 9
Регистрация: 29.07.2010
Сообщений: 261
19.04.2016, 18:52  [ТС] #10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Все Всем спасибо большое. Все заработало.
Кликните здесь для просмотра всего текста

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Private Sub Button45_Click(sender As Object, e As EventArgs) Handles Button45.Click
 
 
        Dim D = DateTime.Today  ' получаем текущию дату
        Dim Dp = D.ToString("MM.yyyy", CultureInfo.InvariantCulture) ' преобразовываем текущую дату в нужный формат месяц-год
        Label27.Text = Dp
        sqConnection.Open() ' получаем даты
        Dim pdp As Integer
        Dim command As SQLiteCommand = New SQLiteCommand("select COUNT(DISTINCT `dat`) from Se where dat like '%" & Dp & "';", sqConnection)
        Dim reader As SQLiteDataReader = command.ExecuteReader()
        If reader.HasRows Then
            Do While reader.Read()
                pdp = reader.GetInt32(0)
 
 
            Loop
        Else : Console.WriteLine("noy")
        End If
        reader.Close()
 
        For i = 0 To pdp
            Dim di = DateTime.Today
            Dim diu = di.ToString("dd", CultureInfo.InvariantCulture)
            'Dim newdat = diu(-i).ToString
            Dim newdat = D.AddDays(-i).ToString.Replace(" 0:00:00", "")
            Console.WriteLine(newdat)
            Dim pdp1 As Integer
            Dim command1 As SQLiteCommand = New SQLiteCommand("select COUNT(DISTINCT `namess`) from Se where dat = '" & newdat & "';", sqConnection)
            Dim reader1 As SQLiteDataReader = command1.ExecuteReader()
            If reader1.HasRows Then
 
                Do While reader1.Read()
                    pdp1 = reader1.GetInt32(0)
                    Chart1.Series("1").XValueType = DataVisualization.Charting.ChartValueType.Date
                    Chart1.Series("1").ChartType = DataVisualization.Charting.SeriesChartType.Line
                    Chart1.Series("1").Color = Drawing.Color.Black
                    Chart1.Series("1").IsValueShownAsLabel = True
                    Chart1.Series("1").IsVisibleInLegend = False
                    Chart1.ChartAreas(0).AxisX.Interval = 1
                    Chart1.Series("1").Points.AddXY(newdat, pdp1)
                    Console.WriteLine(pdp1)
                Loop
            Else : Console.WriteLine("noy")
            End If
            reader1.Close()
        Next
        sqConnection.Close()
        Chart1.Visible = True
    End Sub
2
Миниатюры
Построение графика по данным из БД  
vova_king
24 / 24 / 9
Регистрация: 29.07.2010
Сообщений: 261
10.09.2016, 22:39  [ТС] #11
А можно вопрос?
Почему он с течением какого-то времени отображает данные не с 01 (начала месяца) а захватывает 1 день с прошлого с месяца?
0
Миниатюры
Построение графика по данным из БД  
Yury Komar
Модератор
Эксперт .NET
2371 / 2177 / 348
Регистрация: 27.01.2014
Сообщений: 3,913
Завершенные тесты: 1
10.09.2016, 22:50 #12
доп вопрос: а как кликнув по графику - получить Дату и значение в месте клика, скажет в MessageBox? че-то не вьехал, а очень надо... или же при движении мышки в реальном времени читать значения графика куда-нибудь в лэйбл?

тоесть есть проект, и график выбирает данные за год и более, и отследить изменения на графике очень тяжело визуально. как-то можно кликая по нему - получить значения в месте клика?
0
Миниатюры
Построение графика по данным из БД  
ovva
2349 / 1991 / 486
Регистрация: 02.02.2013
Сообщений: 1,848
Записей в блоге: 2
11.09.2016, 00:24 #13
Yury Komar,
Добавьте ToolTip. Тогда можно так
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Chart1_GetToolTipText(sender As System.Object, e As System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs) Handles Chart1.GetToolTipText
    Dim sts As Boolean
    Dim txt As String = ""
    Dim htResult As HitTestResult = e.HitTestResult
    If htResult.PointIndex = -1 OrElse htResult.Series Is Nothing Then
        sts = False
    Else
        sts = True
    End If
    Me.ToolTip1.Active = sts
    If sts Then
        txt = e.HitTestResult.Series.Points(e.HitTestResult.PointIndex).ToString()
        ToolTip1.Show(txt, Chart1, e.X, e.Y + 20)
    End If
End Sub
Правда, здесь нужно заметить:
Данные берутся для точки и не интерполируются.
Значения в формате Date будут представлены в виде целого числа.
1
Yury Komar
Модератор
Эксперт .NET
2371 / 2177 / 348
Регистрация: 27.01.2014
Сообщений: 3,913
Завершенные тесты: 1
11.09.2016, 11:05 #14
ovva, спасибо. попробую.

Добавлено через 2 минуты
ovva, а Zoom колесом мышки есть у этого компонента? у меня есть одно решение, позже скину, но он работает очень криво. может ечть встроенное решение?

Добавлено через 3 часа 51 минуту
ovva, спасибо, попробовал, но, это не то немного... мне же хотелось бы при клике по графику в любом месте, нарисовать кармер красны(он ка ратинке отображается) и получить все значения по всем осям на этом маркере.
тоесть:
1) кликаем, отображается красный маркер в месте клика (готово)
2) например в MsgBox показать значения всех нарисованных графиков в месте маркера по оси Y включая значение (оно одно для всех будет, по оси X...

это реально сделать?
0
Yury Komar
Модератор
Эксперт .NET
2371 / 2177 / 348
Регистрация: 27.01.2014
Сообщений: 3,913
Завершенные тесты: 1
11.09.2016, 11:57 #15
разобрался с выводом ВСЕХ значений по оси Х в тултип, но это только при наведении на любую из линий гафиков. а нужно переделать на клик по графику, а еще лучше на движение мышки по полю влево-вправо, курсор сам рисуоваться должен и в отдельном окошке показывать все параметры, которые в тултипе сохранены. думаю реально. буду разбираться, вот пока что сделал:
Кликните здесь для просмотра всего текста
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Chart1_GetToolTipText(sender As System.Object, e As System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs) Handles Chart1.GetToolTipText
        On Error Resume Next
        Dim sts As Boolean
        Dim txt As String = ""
        Dim htResult As HitTestResult = e.HitTestResult
        If htResult.PointIndex = -1 OrElse htResult.Series Is Nothing Then
            sts = False
        Else
            sts = True
        End If
        Me.ChartToolTip.Active = sts
 
        If sts Then
            txt = e.HitTestResult.Series.Points(e.HitTestResult.PointIndex).Tag.split(vbCrLf)(0)
            For Each ser As Series In Chart1.Series
                txt &= vbCrLf & ser.Points(e.HitTestResult.PointIndex).LegendText
                txt &= " = " & ser.Points(e.HitTestResult.PointIndex).Tag.split(vbCrLf)(1)
            Next
            ChartToolTip.Show(txt, Chart1, e.X, e.Y + 20)
        End If
    End Sub
1
Миниатюры
Построение графика по данным из БД  
ovva
2349 / 1991 / 486
Регистрация: 02.02.2013
Сообщений: 1,848
Записей в блоге: 2
11.09.2016, 14:12 #16
vova_king,
Добавьте
vb.net
1
2
Chart1.ChartAreas(0).AxisX.Minimum = (New Date(2005, 2, 1)).ToOADate
Chart1.ChartAreas(0).AxisX.Maximum = (New Date(2005, 2, 28)).ToOADate
Данные, естественно, д.б. ваши.
На картинках: до и после добавления Max/Min.
1
Миниатюры
Построение графика по данным из БД   Построение графика по данным из БД  
11.09.2016, 14:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2016, 14:12

Построение графика
Всех приветствую! Мужики, помогите разобраться. Вот такой график нужно...

Построение графика в PictureBox
Здравствуйте! Передо мной стоит следующая задача: Построение графики функции...

Построение графика с DrawBezier
Доброго времени суток, пишу программу, которая решает дифференциальное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru