请教大神帮指点用Chart作图

PuBuQingQuan 2017-10-28 10:16:05
本人想做的效果图是这样的


数据格式如下


下面这段代码简单画了个图,远远不够
Chart2.ChartAreas.Clear() '清除所有绘图区
Chart2.Legends.Clear() '清除 图例说明
Dim newChartAreas2 As New ChartArea("Default") '新增绘图区
Chart2.ChartAreas.Add(newChartAreas2)
Dim newLegends2 As New Legend(legendName) '新增 图例说明
Chart2.Legends.Add(newLegends2)
Chart2.ChartAreas("Default").Position.Height = 100 '绘图区域所占百分比
Chart2.ChartAreas("Default").Position.Width = 100
Chart2.ChartAreas("Default").AxisX.Title = "Freq(Hz)" 'X轴名称
Chart2.ChartAreas("Default").AxisX.TitleAlignment = StringAlignment.Center 'X轴标题位置
Chart2.ChartAreas("Default").AxisY.Title = "Phase" 'Y轴名称
Chart2.ChartAreas("Default").AxisY.TitleAlignment = StringAlignment.Center 'Y轴标题位置
Chart2.ChartAreas("Default").AxisX.Minimum = -5
Chart2.ChartAreas("Default").AxisX.Maximum = 5
Chart2.ChartAreas("Default").AxisX.LabelStyle.Format = "0.00" 'X轴 显示格式
Chart2.ChartAreas("Default").AxisX.MajorGrid.Enabled = True
Chart2.ChartAreas("Default").AxisX.MajorGrid.Interval = 1
Chart2.ChartAreas("Default").AxisX.MajorGrid.LineColor = Color.LightGray
Chart2.ChartAreas("Default").AxisX.MinorGrid.Enabled = True '启用 次辅助线 功能
Chart2.ChartAreas("Default").AxisX.MinorGrid.Interval = 0.2 '次辅助线 间距为10
Chart2.ChartAreas("Default").AxisX.MinorGrid.LineColor = Color.LightSlateGray '次辅助线颜色为灰色
'Chart1.ChartAreas("Default").AxisX.Interval = 1 'Y轴的 主线间距major
Chart2.ChartAreas("Default").AxisX.MajorGrid.LineColor = Color.White


'Y轴的 数值区间
Chart2.ChartAreas("Default").AxisY.Minimum = -3141
Chart2.ChartAreas("Default").AxisY.Maximum = 3141
'Y轴的 数值间隔
Chart2.ChartAreas("Default").AxisY.MinorTickMark.IntervalOffset = 0
Chart2.ChartAreas("Default").AxisY.MajorGrid.Enabled = True
Chart2.ChartAreas("Default").AxisY.MajorGrid.Interval = 1000
Chart2.ChartAreas("Default").AxisY.MajorGrid.LineColor = Color.LightGray
Chart2.ChartAreas("Default").AxisY.MinorGrid.Enabled = True '启用 次辅助线 功能
Chart2.ChartAreas("Default").AxisY.MinorGrid.Interval = 200 '次辅助线 间距为10
Chart2.ChartAreas("Default").AxisY.MinorGrid.LineColor = Color.LightSlateGray '次辅助线颜色为灰色
Chart2.ChartAreas("Default").AxisY.Interval = 500 'Y轴的 主线间距major
Chart2.ChartAreas("Default").AxisY.MajorGrid.LineColor = Color.White

Chart2.Series.Clear() '清除所有数据集
Dim newSeries2 As New Series("Phase")
newSeries2.ChartType = SeriesChartType.Point
newSeries2.BorderWidth = 2
newSeries2.Color = Color.Green
newSeries2.XValueType = ChartValueType.Double
newSeries2.IsValueShownAsLabel = False
newSeries2.MarkerStyle = MarkerStyle.Square
Chart2.Series.Add(newSeries2)


太丑了





望大神指点,不管用Ghphics画还是用Chart画都可以,另一篇帖子一样的,大神帮解决下分都归你,用vb.net编写,谢谢!
本人qq 327553229
...全文
889 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
pubu2005 2017-11-06
  • 打赏
  • 举报
回复
运行还是有问题,没看懂代码
PuBuQingQuan 2017-10-31
  • 打赏
  • 举报
回复
station这个数组有问题,station列表没东西加进来
PuBuQingQuan 2017-10-31
  • 打赏
  • 举报
回复
运行通过,但是没出图,没反应,我倾向于数组的代码,这个我看起来好吃力,也不好修改
赵4老师 2017-10-31
  • 打赏
  • 举报
回复
注释掉所有On Error Resume Next语句,在VB IDE中运行, 出错后点击调试,光标会停在出错的那条语句处, 或者 事先在怀疑可能有逻辑错误的语句处设置断点,运行经过断点时中断, 此时可以在立即窗口中使用 ?变量名 或 ?函数名(函数参数) 或 过程名(参数) 辅助调试。
X-i-n 2017-10-31
  • 打赏
  • 举报
回复
你的文本里有空行,读到空行应该跳过此行的处理。 在出错的这行代码上面加一句
if b.length=1 then continue for
PuBuQingQuan 2017-10-31
  • 打赏
  • 举报
回复
用数组操作感觉会清晰明了点,哪位大神帮写个数组操作的代码,谢了
PuBuQingQuan 2017-10-31
  • 打赏
  • 举报
回复
出错在这里
X-i-n 2017-10-30
  • 打赏
  • 举报
回复
DataTable是一个数据表对象,跟excel的工作表一样,Column是字段,Row是一条数据记录。数组应该可以,没测过,灵活性肯定比DataTable要差一大截。 Array可以用For Each添加到DataTable里。 ds.Tables(station).Rows.Add(d(2), d(3), d(5), d(6)) 或者 ds.Tables(station).Rows.Add({d(2), d(3), d(5), d(6)}) 间隔越来越大的话,你的Y轴就不能是Resistivity和Phase了,数据源里应该添加的Y值是Math.Log(d(5))和Math.Log(d(6)),Math.Log=ln,以e为底。Math.Log10以10为底。 Chart是自适应的,会尽量所有数据并且最大,缩放可以给Xaxis添加滚动条。
pubu2005 2017-10-30
  • 打赏
  • 举报
回复
直接用数组做数据源行不行呢,这个data那个什么数据源好难看懂,图的自适应范围没看到有定义?坐标轴都要取对数,因为数据间隔越来越大
pubu2005 2017-10-30
  • 打赏
  • 举报
回复
好的谢了,有空我调试看下,看哪里需要再完善的
X-i-n 2017-10-30
  • 打赏
  • 举报
回复
具体是哪一行?DEBUG一下,看一下出错的对象是谁,一共有几个元素,请求的是第几个元素。
PuBuQingQuan 2017-10-30
  • 打赏
  • 举报
回复
Imports System.IO Imports System.Windows.Forms.DataVisualization.Charting Imports System.Math Public Class Form1 Dim ds As New DataSet Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim ofd As New OpenFileDialog ofd.Title = "打开" ofd.Filter = "amt数据(*.avg)|*.avg" ofd.Multiselect = False If ofd.ShowDialog() = DialogResult.OK Then Dim avgFile As String = ofd.FileName Dim sr As New StreamReader(ofd.FileName) Dim strData As String = sr.ReadToEnd 'Dim strData As String = IO.File.ReadAllText("C:\data\xxx.txt", System.Text.Encoding.UTF8)   '从文本文件里读数据 For Each line As String In Split(Split(strData, vbCrLf).Last, vbCrLf) 'Split(Split(strData, $"+{vbCrLf}").Last, vbCrLf) Dim d() As String = line.Split({" "}, StringSplitOptions.RemoveEmptyEntries) Dim station As String = d(1) '为每个station创建一个DataTable作为数据源,Chart控件作为展示 If Not ds.Tables.Contains(station) Then Dim _chart As New DataVisualization.Charting.Chart() With _chart '每个Chart控件有两个Area .Name = station .Width = 680 .ChartAreas.Clear() .ChartAreas.Add("Resistivity") .ChartAreas.Add("Phase") .Titles.Add(station & " - Resistivity").Alignment = ContentAlignment.TopCenter '''.Titles.Add($"{station} - Resistivity").Alignment = ContentAlignment.TopCenter .Titles.Add(station & " - Phase").Alignment = ContentAlignment.TopCenter ''''.Titles.Add($"{station} - Phase").Alignment = ContentAlignment.TopCenter .Titles(1).DockedToChartArea = "Phase" End With FlowLayoutPanel1.Controls.Add(_chart) '格式化数据源 Dim table As DataTable = ds.Tables.Add(station) With table.Columns .Add("Freq", Type.GetType("System.Double")) .Add("Comp") .Add("Resistivity", Type.GetType("System.Double")) .Add("Phase", Type.GetType("System.Double")) End With End If ds.Tables(station).Rows.Add(d(2), d(3), d(5), d(6)) Next '遍历所有station,画图 For Each table As DataTable In ds.Tables ListBox1.Items.Add(table.TableName) '每个datable代表一个station,放到一个 chart里,Resistivity画一个area,Phase画一个area Dim _chart As DataVisualization.Charting.Chart = CType(FlowLayoutPanel1.Controls().Item(table.TableName), DataVisualization.Charting.Chart) _chart.Series.Add(New DataVisualization.Charting.Series("ExHy_Resistivity")) _chart.Series.Add(New DataVisualization.Charting.Series("EyHx_Resistivity")) _chart.Series.Add(New DataVisualization.Charting.Series("ExHy_Phase")) _chart.Series.Add(New DataVisualization.Charting.Series("EyHx_Phase")) For Each s As DataVisualization.Charting.Series In _chart.Series s.ChartType = DataVisualization.Charting.SeriesChartType.Line Next '通过Comp列筛选所在area, 绑定Freq到X轴,Resistivity和Phase到Y轴 With _chart.Series(0) .ChartArea = "Resistivity" .XValueMember = "Freq" .Points.DataBind( table.Rows.Cast(Of DataRow). Where(Function(r) r("Comp") = "ExHy"). Select(Function(r) r), "Freq", "Resistivity", Nothing) End With With _chart.Series(1) .ChartArea = "Resistivity" .Points.DataBind( table.Rows.Cast(Of DataRow). Where(Function(r) r("Comp") = "EyHx"). Select(Function(r) r), "Freq", "Resistivity", Nothing) End With With _chart.Series(2) .ChartArea = "Phase" .XValueMember = "Freq" .Points.DataBind( table.Rows.Cast(Of DataRow). Where(Function(r) r("Comp") = "ExHy"). Select(Function(r) r), "Freq", "Phase", Nothing) End With With _chart.Series(3) .ChartArea = "Phase" .Points.DataBind( table.Rows.Cast(Of DataRow). Where(Function(r) r("Comp") = "EyHx"). Select(Function(r) r), "Freq", "Phase", Nothing) End With Next End If End Sub Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged DataGridView1.DataSource = ds.Tables(ListBox1.SelectedItem) End Sub End Class 运行没有问题,打开数据提示“索引超出数组界限”,这是哪里的问题啊
PuBuQingQuan 2017-10-30
  • 打赏
  • 举报
回复
Split(Split(strData, $"+{vbCrLf}").Last, vbCrLf) 等效于什么呢
PuBuQingQuan 2017-10-30
  • 打赏
  • 举报
回复
好的谢谢了,你写的程序很好,我结帖了,您加我个qq好向您学习,谢谢 327553229
X-i-n 2017-10-30
  • 打赏
  • 举报
回复
listbox和datagridview是用来查看数据的,可以删掉。Chart画图的一些细节你再看着美化一下吧,所有设置我都用的默认。
Public Class Form1
    Dim ds As New DataSet
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Dim strData As String = IO.File.ReadAllText("C:\data\xxx.txt", System.Text.Encoding.UTF8)   '从文本文件里读数据
        Dim strData As String = "\ by amt
            $ ASPACE=  100m
            $ XMTR  =   200.
            skp Station       Freq  Comp Amps Resistivity   Phase    %Rho   sPhz
            \-++------++----------++---++----++---------++------++------++-----+
             2   1270.0  1.0312E+04 ExHy  0.00  1.4241E+2   704.3     0.0    0.0
             2   1270.0  8.2500E+03 ExHy  0.00  1.4058E+2  1099.1     0.0    0.0
             2   1280.0  7.3242E+00 EyHx  0.00  1.1105E+3 -2702.9     4.6   45.7"
        'skp Station       Freq  Comp Amps Resistivity   Phase    %Rho   sPhz

        For Each line As String In Split(Split(strData, $"+{vbCrLf}").Last, vbCrLf)
            Dim d() As String = line.Split({" "}, StringSplitOptions.RemoveEmptyEntries)
            Dim station As String = d(1)
            '为每个station创建一个DataTable作为数据源,Chart控件作为展示
            If Not ds.Tables.Contains(station) Then
                Dim _chart As New DataVisualization.Charting.Chart()
                With _chart '每个Chart控件有两个Area
                    .Name = station
                    .Width=680
                    .ChartAreas.Clear()
                    .ChartAreas.Add("Resistivity")
                    .ChartAreas.Add("Phase")
                    .Titles.Add($"{station} - Resistivity").Alignment = ContentAlignment.TopCenter
                    .Titles.Add($"{station} - Phase").Alignment = ContentAlignment.TopCenter
                    .Titles(1).DockedToChartArea = "Phase"
                End With
                FlowLayoutPanel1.Controls.Add(_chart)

                '格式化数据源
                Dim table As DataTable = ds.Tables.Add(station)
                With table.Columns
                    .Add("Freq", Type.GetType("System.Double"))
                    .Add("Comp")
                    .Add("Resistivity", Type.GetType("System.Double"))
                    .Add("Phase", Type.GetType("System.Double"))
                End With
            End If
            ds.Tables(station).Rows.Add(d(2), d(3), d(5), d(6))
        Next

        '遍历所有station,画图
        For Each table As DataTable In ds.Tables
            ListBox1.Items.Add(table.TableName)
            '每个datable代表一个station,放到一个 chart里,Resistivity画一个area,Phase画一个area
            Dim _chart As DataVisualization.Charting.Chart = CType(FlowLayoutPanel1.Controls().Item(table.TableName), DataVisualization.Charting.Chart)
            _chart.Series.Add(New DataVisualization.Charting.Series("ExHy_Resistivity"))
            _chart.Series.Add(New DataVisualization.Charting.Series("EyHx_Resistivity"))
            _chart.Series.Add(New DataVisualization.Charting.Series("ExHy_Phase"))
            _chart.Series.Add(New DataVisualization.Charting.Series("EyHx_Phase"))
            For Each s As DataVisualization.Charting.Series In _chart.Series
                s.ChartType = DataVisualization.Charting.SeriesChartType.Line
            Next

            '通过Comp列筛选所在area, 绑定Freq到X轴,Resistivity和Phase到Y轴
            With _chart.Series(0)
                .ChartArea = "Resistivity"
                .XValueMember = "Freq"
                .Points.DataBind(
                    table.Rows.Cast(Of DataRow).
                    Where(Function(r) r("Comp") = "ExHy").
                    Select(Function(r) r), "Freq", "Resistivity", Nothing)
            End With
            With _chart.Series(1)
                .ChartArea = "Resistivity"
                .Points.DataBind(
                    table.Rows.Cast(Of DataRow).
                    Where(Function(r) r("Comp") = "EyHx").
                    Select(Function(r) r), "Freq", "Resistivity", Nothing)
            End With

            With _chart.Series(2)
                .ChartArea = "Phase"
                .XValueMember = "Freq"
                .Points.DataBind(
                    table.Rows.Cast(Of DataRow).
                    Where(Function(r) r("Comp") = "ExHy").
                    Select(Function(r) r), "Freq", "Phase", Nothing)
            End With
            With _chart.Series(3)
                .ChartArea = "Phase"
                .Points.DataBind(
                    table.Rows.Cast(Of DataRow).
                    Where(Function(r) r("Comp") = "EyHx").
                    Select(Function(r) r), "Freq", "Phase", Nothing)
            End With
        Next
    End Sub

    Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
        DataGridView1.DataSource = ds.Tables(ListBox1.SelectedItem)
    End Sub
End Class
X-i-n 2017-10-30
  • 打赏
  • 举报
回复
更新到2015或者2017吧,这是2015开始有的特性,字符串插值,将变量直接写进字符串,算是语法糖,和老版本里的format差不多。
    Sub Main()
        Dim a As String = "aaa"
        Dim b As String = "bbb"
        Dim c As String = "ccc"
        Console.WriteLine(a + "-" + b + "-" + c)
        Console.WriteLine(String.Format("{0}-{1}-{2}", a, b, c))
        Console.WriteLine(String.Format("{0}-{1}-{2}", {a, b, c}))
        Console.WriteLine($"{a}-{b}-{c}")
        '都等于aaa-bbb-ccc
        Console.Read()
    End Sub
.Titles.Add($"{station} - Resistivity").Alignment = ContentAlignment.TopCenter
                    .Titles.Add($"{station} - Phase").Alignment = ContentAlignment.TopCenter
'等效
.Titles.Add(station & " - Resistivity").Alignment = ContentAlignment.TopCenter
                    .Titles.Add(station & " - Phase").Alignment = ContentAlignment.TopCenter
PuBuQingQuan 2017-10-30
  • 打赏
  • 举报
回复
.Titles.Add($"{station} - Resistivity").Alignment = ContentAlignment.TopCenter                     .Titles.Add($"{station} - Phase").Alignment = ContentAlignment.TopCenter 我调试时提示三处 $ 无效,为啥呢 ,去掉该字符后运行打开数据提示数组越界
PuBuQingQuan 2017-10-30
  • 打赏
  • 举报
回复
是,麻烦给弄一个水平 垂直的滚动条
pubu2005 2017-10-29
  • 打赏
  • 举报
回复
哪位大神有空帮忙?
加载更多回复(2)

1,066

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧