none
chart的使用方法 RRS feed

  • 问题

  • 每隔一分钟,我将几个温控器的温度记录到Access数据库,生成温度的每日报表,每日的报表是一个以时间为文件名的Access文件。表中字段有序号,记录时间,温控器一温度,温控器二温度……。请教如何以记录时间为横坐标,温度值为纵坐标将这些温控器的数据在chart控件上用折线图的方式显示出来(需要动态绑定表,以供选择显示不同日期的数据库表)。万分感谢!


    2016年9月3日 12:46

答案

全部回复

  • 或许你需要考虑多线程+绘图。

    绘图的时候,注意自定义X和Y轴。

    具体可以参考Chart示例代码:https://code.msdn.microsoft.com/Samples-Environments-for-b01e9c61/view/SamplePack#content


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2016年9月3日 13:15
    版主
  • 您给的链接好像是C#代码,我需要VB.net的。目前我已能将数据库连接并显示。目前需要解决两个问题先,第一个是我把chart调整到全屏后,chartarea(0)只显示在上半部,我需要把它显示的高度调整一下,显示到大部分屏幕,但我更改chartarea(0)的任何位置属性后,就看不到图线了(辟如修改position.x=1)。第二个是如何用时间来做为横坐标,因为例如我的数据库内的时间可能是2016 09/02 0:0:0 至2016 09/02 23:59:59。(其中每60秒左右记录一个数据.)


    2016年9月3日 15:56
  • 是否可以方便分享你的代码,上传到你的某个云端,我们下载分析看看呢?

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2016年9月4日 0:56
    版主
  • http://pan.baidu.com/s/1miNKojQ  提取码:1f8a

    (显示的问题已解决)但由于我目前不知使用时间如何处理,因此横坐标使用的是序号,您能帮我改成横坐标是时间吗。感谢您的帮助。



    2016年9月4日 2:12
  • Imports ADOX
    Imports System.Data.OleDb
    Imports System.Windows.Forms.DataVisualization.Charting
    Public Class Form1
        Dim OleDbConn As OleDbConnection
        Dim MyDataSet As DataSet
        Dim MyOleDataAdapter As OleDbDataAdapter
        Private Sub Form1_Load(sender As Object, e As EventArgsHandles MyBase.Load
            Dim tempDatabasePath As String = Application.StartupPath & "\DayReport\temp\temp-" & Format(Date.Today, "D") & ".accdb;"
     
            Dim connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & tempDatabasePath & "Persist Security Info=False"
            OleDbConn = New OleDbConnection(connstring)
            MyDataSet = New DataSet
            MyOleDataAdapter = New OleDbDataAdapter
            OleDbConn.Open()
            MyOleDataAdapter.SelectCommand = New OleDbCommand("Select * from 溫度數據日報表", OleDbConn)
            MyOleDataAdapter.Fill(MyDataSet)
     
     
            Chart1.Series.Clear()
            Dim ChartAreas1 As New ChartArea("02陽極一")
            Chart1.ChartAreas.Add(ChartAreas1)
            Chart1.ChartAreas(0).AxisX.Title = "時間"
            Chart1.ChartAreas(0).AxisY.Title = "溫度"
            Chart1.ChartAreas(0).AxisX.ScrollBar.IsPositionedInside = False
            Chart1.ChartAreas(0).AxisX.ScrollBar.Size = 20
            Chart1.ChartAreas(0).AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Dash
            Chart1.ChartAreas(0).AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash
            Chart1.ChartAreas(0).AxisX.MajorGrid.LineColor = Color.Violet
            Chart1.ChartAreas(0).AxisY.MajorGrid.LineColor = Color.Violet
            '按照分钟自动分割:单位1分钟
            Chart1.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Minutes
            Chart1.ChartAreas(0).AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount
            Chart1.ChartAreas(0).AxisY.IntervalAutoMode = IntervalAutoMode.VariableCount
            '自动格式化时间
            Chart1.ChartAreas(0).AxisX.LabelStyle.Format = "{yyyy/MM/dd  HH:mm:ss}"
            Chart1.ChartAreas(0).AxisX.ScrollBar.IsPositionedInside = False
            Chart1.ChartAreas(0).AxisX.ScaleView.Zoomable = True
            Chart1.ChartAreas(0).CursorX.IsUserEnabled = True
            Chart1.ChartAreas(0).CursorX.IsUserSelectionEnabled = True
            Chart1.ChartAreas(0).CursorX.Interval = 0
            Chart1.ChartAreas(0).CursorX.IntervalOffset = 0
            Chart1.ChartAreas(0).CursorX.IntervalType = DateTimeIntervalType.Minutes
     
            
            Chart1.ChartAreas(0).AxisX.Interval = 1
            Chart1.ChartAreas(0).AxisY.Minimum = 0
            Chart1.ChartAreas(0).AxisY.Maximum = 100
            Chart1.ChartAreas(0).AxisY.Interval = 5
     
            Chart1.Series.Clear()
            Dim series1 As New Series("02陽極一")
            series1.ChartType = SeriesChartType.Line
            Chart1.Series.Add(series1)
            For i As Integer = 1 To MyDataSet.Tables(0).Rows.Count
                Chart1.Series("02陽極一").Points.AddXY(CDate(MyDataSet.Tables(0).Rows(i - 1).Item("記錄時間")), MyDataSet.Tables(0).Rows(i - 1).Item("02陽極一"))
            Next
     
            MyOleDataAdapter.Dispose()
            OleDbConn.Close()
        End Sub
    End Class
    

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2016年9月4日 4:56
    版主
  • 万分感谢您的帮助!请原谅我取消答复标记。因为还有一个事情需您帮忙,但我不知如何能找到你。随后我会标记为答案。

    我程序原来的意图是不使用滚动条。采用记录的多少来改变X坐标间隔(30分钟为单位,也就是说,当记录数为1~31时,是每分钟一个间隔,当记录数为31~61时 ,以每两分钟为间隔,并以此类推,而记录数为1411~1441时以48分钟为间隔;用序号来间隔我是如程序实现了,但由于是处理时间,我不知道怎么弄了)。以使得能清楚地看到时间间隔,也能看到曲线温度的变化。(以每分钟记录一次,一天最多1440个记录)

    再次对您的帮助表示感谢!





    2016年9月4日 6:14
  • 等你完全确认了才标记吧,没关系的。

    删除以下语句:

    Chart1.ChartAreas(0).AxisX.ScrollBar.IsPositionedInside = False
            Chart1.ChartAreas(0).AxisX.ScaleView.Zoomable = True
            Chart1.ChartAreas(0).CursorX.IsUserEnabled = True
            Chart1.ChartAreas(0).CursorX.IsUserSelectionEnabled = True
            Chart1.ChartAreas(0).CursorX.Interval = 0
            Chart1.ChartAreas(0).CursorX.IntervalOffset = 0
            Chart1.ChartAreas(0).CursorX.IntervalType = DateTimeIntervalType.Minutes


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download


    2016年9月4日 8:50
    版主
  • 删除这几条语句只解决了不使用滚动条的问题。我是想象我原来那样动态改变x轴坐标间隔。因为原来是使用序数的,好计算。但现在换成了时间,我不知道该如何来计算这些时间并赋值。原来我的动态改变代码如下:

            Dim x As Integer
            If (MyDataSet.Tables(0).Rows.Count - 1) Mod 30 > 0 Then
                x = (MyDataSet.Tables(0).Rows.Count - 1) \ 30 + 1
            Else
                x = CInt((MyDataSet.Tables(0).Rows.Count - 1) / 30)
            End If

            Chart1.ChartAreas(0).AxisX.Minimum = 0
            Chart1.ChartAreas(0).AxisX.Maximum = x * 30
            Chart1.ChartAreas(0).AxisY.Minimum = 0
            Chart1.ChartAreas(0).AxisY.Maximum = 100
            Chart1.ChartAreas(0).AxisX.Interval = x
            Chart1.ChartAreas(0).AxisY.Interval = 0


    2016年9月4日 9:02
  • 你好:

    不知道你的规则,但是我可以告诉你一些重要语句如何使用:

      '按照分钟自动分割:单位:分钟
            Chart1.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Minutes

    这句话和以下对应,以下的话对应多少分钟设置一次:

    Chart1.ChartAreas(0).AxisX.Interval = 30 //30分钟一次


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2016年9月4日 9:13
    版主
  • 规则是试图计算数据库ID(“記錄時間”)最后一条记录与第一条记录的时间差的秒数,用这一差值去除以1800秒,如果无余数则得到结果x,若得到的结果有余数则进1得到(x=结果的整数+1)。则设置x轴间隔为x,而x轴最大值则为X*1800。这样当数据量增加时由于X轴间隔被按倍数增大,X轴间隔线被固定为30个分隔线。

            Chart1.ChartAreas(0).AxisX.Minimum = ?     如何设置此最小值为数据库第一个时间?
            Chart1.ChartAreas(0).AxisX.Maximum =?      此最大值该如何运用计算所得的结果?
             Chart1.ChartAreas(0).AxisX.Interval = ?      此最小值该如何运用计算所得的结果?

    2016年9月4日 9:37
  • Chart1.ChartAreas(0).AxisX.Minimum/maximum = DateTime.Parse("1900/1/1 00:00:00").ToOADate();

    使用年月日 时分秒的方式

    Chart1.ChartAreas(0).AxisX.Interval = 每隔多少分钟,X出现一次。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download


    2016年9月4日 9:48
    版主
  • 十分感谢你的解答,问题基本已解决。最后一个问题是由于X坐标为日时分秒,太长,希望能向左下方斜向显示。

    再次对您表示感谢。

    2016年9月4日 10:50
  • 没有关系,

    可以设定坐标旋转角度,如:

    Chart1.ChartAreas(0).AxisX.LabelStyle.Angle =-45;   'x轴倾斜的角度。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2016年9月4日 11:08
    版主
  • 你好,我也遇到了类似问题,你把问题解决了,是否方便发一下让我参考一下,892795977@qq.com,多谢了!
    2016年11月28日 14:40
  • 楼主我也遇到了同样的问题,可否发一下邮件让我参考一下,多谢了,邮箱445720029@qq.com
    2018年7月1日 14:03