Link to home
Start Free TrialLog in
Avatar of AWaterfalls
AWaterfalls

asked on

vb6 chart graphics.

Dear Experts, I would ike to use the vb6 chart control to show a bar and line chart of data from a csv file, I'm not sure if it can be done but is it possible to get the chart to accept data from a csv file and plot a bar and line chart from the data in the file. I would also like to find the equation of the line chart and display this in a textbox. Thank you for any help you can give. The csv file is sorted by frequency in ascending order.

The csv file data is in the form as shown below:

Number     Frequency
39             34
26             76
15             120
etc            etc
Avatar of shorvath
shorvath
Flag of Canada image

any sort order for x or y values?
Avatar of AWaterfalls
AWaterfalls

ASKER

Sort  Ascending Frequency (y)
No Further Comment.
Try this:

Insert a Microsoft Chart Control into your project.
(On the Project menu, click Components)
Microsoft Chart Control 6.0 (SP4) (OLEDB)
      (on Windows XP: c:\windows\system32\MSCHRT20.OCX)

Private Sub Form_Load()
  MSChart1.Visible = False
End Sub

Private Sub Command1_Click()

  Dim i As Long
  Dim j As Long
  Dim sHeader As String
  Dim sLine As String
  Dim aItems() As String
  
  Dim sFileName As String
  Dim nFileNum As Long
  Dim aData() As String

  Screen.MousePointer = vbHourglass
  
  nFileNum = FreeFile
  
  Open App.Path & "\" & "yourcsv.csv" For Input As #nFileNum
  
  '/ set headers
  Line Input #nFileNum, sHeader
  aItems = Split(sHeader, ",")
  
  ' When you create a multi-dimensioned array, the first series can be assigned a string;
  ' when the array is assigned to the ChartData property, the strings become the labels for the rows.
  ReDim Preserve aData(LBound(aItems) To UBound(aItems), i)

  For j = 0 To UBound(aItems)
      aData(j, i) = aItems(j)
  Next j
  '/

  ' loop through file and populate rest of the multi-dimensioned array
  i = 1
  Do While Not EOF(nFileNum)
      ' read line
      Line Input #nFileNum, sLine
      If Not sLine = sHeader Then
          ' split values on comma
          aItems = Split(sLine, ",")
          
          ' When you're using ReDim Preserve on a multidimensional array,
          ' you can resize only its last dimension:
          ReDim Preserve aData(UBound(aItems), i)

          For j = 0 To UBound(aItems)
              aData(j, i) = aItems(j)
          Next j

          i = i + 1
      End If
  Loop
  
  Close #nFileNum

  '/ create a multi-dimensioned array for our chart
  Dim n As Long
  ReDim aDataForChart(i - 1, UBound(aItems))
  For n = 0 To i - 1
      For j = 0 To UBound(aItems)
          aDataForChart(n, j) = aData(j, n)
      Next j
  Next n
  '/

  With MSChart1
  
      .Visible = True
      
      '/ set the chart type
      ' set the chart type to a 2d Line
      .chartType = VtChChartType2dLine
      
      ' set the chart type to a 2d Bar
      '.chartType = VtChChartType2dBar
      '/
      
      ' Plot Data Using Array and the ChartData Property
      .ChartData = aDataForChart
  
      .Height = 3400
    
      ' add chart title
      '.TitleText = "Frequency of Numbers"
      With .Title
          .Text = "Frequency of Numbers"
          .VtFont.Size = 12
          .VtFont.VtColor.Set 255, 0, 0
      End With
    
      ' set chart Labels
      ' (aDataForChart(0,0) : "Number")
      ' (aDataForChart(0,1) : " Frequency")
      For n = 1 To i - 1
          .Row = n
          .RowLabel = aDataForChart(n, 0)
      Next n
    
      Dim serX As Series
      For Each serX In MSChart1.Plot.SeriesCollection
          If serX.LegendText = "Number" Then
              ' Hide "Number" Serie
              serX.Position.Hidden = True
              
              ' Set XAxis Title
              'Dim XAxis As MSChart20Lib.Axis
              'Set XAxis = .Plot.Axis(VtChAxisIdX, 1)
              'XAxis.AxisTitle = serX.LegendText
              
              .Plot.Axis(VtChAxisIdX, 1).AxisTitle = serX.LegendText
              
          ElseIf serX.LegendText = "Frequency" Then
  
              With serX.StatLine
                  ' VtChStatsMean - Shows the mathematical mean of the values in the series. 
                  .Flag = VtChStatsMean
                  .Style(VtChStatsMean) = VtPenStyleDitted  'VtPenStyleDashed  'VtPenStyleDotted
                  .VtColor.Set 255, 0, 0
                  .Width = 1
              End With
              
              ' Set YAxis Title
              ' VtChAxisIdY2 Identifiziert die sekundäre Y-Achse
              'Dim YAxis As MSChart20Lib.Axis
              'Set YAxis = .Plot.Axis(VtChAxisIdY2, 1)
              'YAxis.AxisTitle = serX.LegendText
              
              .Plot.Axis(VtChAxisIdY2, 1).AxisTitle = serX.LegendText
              
          End If
      Next
      
      ' Set Chart footnote
      With .Footnote
          .Location.Visible = True
          .Location.LocationType = VtChLocationTypeBottomLeft
          .Text = "sorted by frequency in ascending order"
          .VtFont.VtColor.Set 128, 128, 128
      End With
      
  End With
  
  Screen.MousePointer = vbDefault

End Sub

Open in new window


The code above produces this chart:
User generated image
for this csv:
Number, Frequency
39,12
26,27
44,46
5,54
10,68
19,77
30,120
Thank you,for your answer. However I am using a microsoft graph chart, not an MSCHART.

As the commands are different for these two charts, and I am unable to download the MSChart. because i have windows 7 x64 bits not xp. As before I am  using vb6.

Could you please rewrite the example using the microsoft graph chart. Thank you.
ASKER CERTIFIED SOLUTION
Avatar of eemit
eemit
Flag of Germany image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial