How to control the color of each slice in a pie chart using ASP and OWC?

I cannot find any descent documentation on formatting pie charts using ASP and OWC. How can I set the color of each slice of the pie chart to the value of my choice?
LVL 5
intreegAsked:
Who is Participating?
 
Faheem ShaikhConnect With a Mentor Commented:
Sorry for the delay, got stuck in some work.

You will  need to have 8, SeriesCollection's

And you will need to have 8 arrays to hold the values?
Like :
val1 = 1,0,0,0,0,0,0,0
val2 = 0,1,0,0,0,0,0,0

And one array for the categories (or slices)
cats = Black,Blue,Red,Green,White,Land,MultiColor,Artifact

As far as using 'two-dimensional array for the values' is concerned, I am not pretty sure how to go about it.
0
 
danataylorCommented:
Couldn't find anything specific to pie charts but found these references at http://www.4guysfromrolla.com/webtech/022101-1.2.shtml related to line charts.  Hope it helps.

objChart.SeriesCollection(2).Interior.Color = "red"
objChart.SeriesCollection(2).Line.Color = "red"
0
 
intreegAuthor Commented:
I have read over that one a few times, if the answer is there I am not observant enough to find it... I am thinking that maybe I am not collecting/setting the data properly.
Do you know if I need to create a series for each pie slice? I belive that is the only way becuase as you posted :

 objChart.SeriesCollection(2).Interior.Color = "red"

The code is modifing the interior color for the entire series. So I guess if that is the only way to control the color, I will need to figure out how to get my data into a seperate series for each slice. Can anyone tell me if this is the direction I need to go or am I missing somehting?
0
Cloud Class® Course: C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

 
intreegAuthor Commented:
Here is the portion of my code that is supposed to generate the graph. However all I get now is a blank gif

...
set objChartSpace = Server.CreateObject("OWC.Chart")
set objChart = objChartSpace.Charts.Add()
set c = objChartSpace.Constants

objChart.Type = c.chChartTypePie
objChart.HasLegend = True



ColorTable.Open "select * from Chart_Color WHERE DeckName = '"&Request.Form("deckname") &"' order by Color"


set objChartSpace.DataSource = ColorTable
objChart.SetData c.chDimSeriesNames, 0, "Color"



for each objSeries in objChart.SeriesCollection

Response.Write "test<br>"


   objSeries.SetData c.chDimCategories, 0, "Color"
   objSeries.SetData c.chDimValues, 0, "Cards"

next


for each axis in objChart.Axes
   axis.HasTitle = True
   if axis.Type = c.chCategoryAxis then
      axis.Title.Caption = "Color"
   else
      axis.Title.Caption = "Cards"
   end if
next

...


The table looks like this:
RowId | Color | Cards | DeckName
1        | Blue  | 10      | My Deck
2        | Red  | 5        | My Deck

etc.

it appears that in this statemnet:
for each objSeries in objChart.SeriesCollection

that there are no objSeriers in the SeriesCollection.... any ideas on why that is?
0
 
Faheem ShaikhCommented:
You can use the following to set the color property for your chart      
  objChartSpace.Charts(0).Interior.Color
AS to why are you not getting the chart I don't know but you can view this sample code, it might help:::

  Set objChartSpace = New OWC11.ChartSpace
            Set chConstants = objChartSpace.Constants
            objChartSpace.Charts.Add
       
            If (CStr(Charttype) = "PIE") Then
   
                chttype = objChartSpace.Constants.chChartTypePie
   
            End If

            If (CStr(Charttype) = "LINE") Then

                chttype = objChartSpace.Constants.chChartTypeLineMarkers

            End If

            TitleChart(0) = "Effort Distribution Activitywise For " & Day(varStartDate) & "/" & MonthName(Month(varStartDate), True) & "/" & Year(varStartDate) & " --" & Day(varFinishDate) & "/" & MonthName(Month(varFinishDate), True) & "/" & Year(varFinishDate)
            objChartSpace.Charts(0).Type = chttype
            objChartSpace.Charts(0).HasLegend = (objChartSpace.Charts(0).Type = objChartSpace.Constants.chChartTypeLineMarkers)
            i = 0
            While Not rsSmgBl.EOF
                For j = 0 To rsSmgBl.Fields.Count - 2
                    Categories(i + j) = rsSmgBl(j).Name
                    Values(i + j) = rsSmgBl(j)
                Next
                rsSmgBl.MoveNext
                i = i + 1
            Wend
            objChartSpace.Charts(0).SeriesCollection.Add
            objChartSpace.Charts(0).SeriesCollection(0).Caption = TitleChart(0)
            objChartSpace.Charts(0).SeriesCollection(0).SetData chConstants.chDimCategories, chConstants.chDataLiteral, Categories
            objChartSpace.Charts(0).SeriesCollection(0).SetData chConstants.chDimValues, chConstants.chDataLiteral, Values
   
   
            Set SeriesLabels = objChartSpace.Charts(0).SeriesCollection(0).DataLabelsCollection.Add
   
            ' Set the number format of the data labels.
            SeriesLabels.NumberFormat = "0.00"

        objChartSpace.Charts(0).Interior.BackColor
       
       
       
            ' Set the data labels to display the value
        ' for the data point.
            SeriesLabels.HasValue = True
            objChartSpace.Charts(0).HasTitle = True
        ' Set the chart title.
            objChartSpace.Charts(0).Title.Font = "Tahoma"
            objChartSpace.Charts(0).Title.Font.Size = 8
            objChartSpace.Charts(0).Title.Font.Bold = True
            'ChartSpace1.Charts(0).Title.Caption = asSeriesNames(0)
                    'Set a variable to the Category (X) axis.
            Set axCategoryAxis = objChartSpace.Charts(0).Axes(0)
   
        ' Set a variable to the Value (Y) axis.
            Set axValueAxis = objChartSpace.Charts(0).Axes(1)
            rsSmgBl.MoveFirst
        ' The following two lines of code enable, and then
        ' set the title for the category axis.
            axCategoryAxis.HasTitle = True
            axCategoryAxis.Title.Caption = "Project Activities (" & rsSmgBl("prj_Name") & ")"
       
        ' The following three lines of code set the font
        ' for the values displayed on the category axis.
            axCategoryAxis.Font = "Arial"
            axCategoryAxis.Font.Size = 8
            axCategoryAxis.Font.Bold = True
   
            ' The following two lines of code enable, and then
            ' set the title for the value axis.
            axValueAxis.HasTitle = True
            axValueAxis.Title.Caption = "Efforts (Hrs)"    'Put your Cation for Y-Axis
       
         ' The following three lines of code set the font
            ' for the values displayed on the value axis.
            axValueAxis.Font = "Arial"
            axValueAxis.Font.Size = 8
            axValueAxis.Font.Bold = True
   
        ' Export the chart to the temporary file
            objChartSpace.ExportPicture l_path, "gif", 800, 400
           

    faheem
0
 
Faheem ShaikhCommented:
This would be a better example::
This will help you get the graph i.e gif file.
As far as changing the color of chart is concerned, wait for my next post.

<%@ language="vbscript" %>
<%
Dim oChart, c, Categories(5), Val1(25),Val2(25), i, sCaption, nData, nOrg
set cn=server.createobject("adodb.connection")
set rs=server.createobject("adodb.recordset")

cn.open("Provider=Microsoft." & _
    "Jet.OLEDB.4.0;Data Source=C:\smgcode" & _
    "\dbSmg.mdb;" & _
    "Persist Security Info=False")

      
rs.Open "Select ec_PlannedCoding as coding,ec_PlannedAnalysis from tbEffortCapture",cn

i=0
while not rs.EOF
      
      Categories(i) = "Week"& CStr(i+1)
      Response.Write rs(0) & "<BR>" & rs(1)
      Val1(i) = rs(0)
      Val2(i) = rs(1)
      rs.MoveNext
      i=i+1
      wend

' Create a Chart Object
Set oChart = CreateObject("OWC10.ChartSpace")
Set c = oChart.Constants

' Set the different parameters for the ChartSpace
oChart.Border.Color = c.chColorNone

' Get Organization number and use it to set the Caption

sCaption1 = "Planned Coding"
sCaption2 = "Planned Analysis"

' Add a chart and set parameters for the chart
' 6 = to line chart
' 12 = smooth line curve
oChart.Charts.Add
oChart.Charts(0).Type = 6
oChart.Charts(0).SeriesCollection.Add
oChart.Charts(0).SeriesCollection(0).Caption = sCaption1
oChart.Charts(0).SeriesCollection(0).SetData c.chDimCategories, c.chDataLiteral, Categories
oChart.Charts(0).SeriesCollection(0).SetData  c.chDimValues,  c.chDataLiteral, Val1



'oChart.Charts.Add
'oChart.Charts(0).Type = 6
oChart.Charts(0).SeriesCollection.Add
oChart.Charts(0).SeriesCollection(1).Caption = sCaption2
oChart.Charts(0).SeriesCollection(1).SetData c.chDimCategories, c.chDataLiteral, Categories
oChart.Charts(0).SeriesCollection(1).SetData  c.chDimValues,  c.chDataLiteral, Val2
oChart.Charts(0).HasLegend = True
oChart.Charts(0).HasTitle = True


' Get a temporary filename to save chart in that file
sFname = Session("FSO").GetTempName & session.SessionID & ".gif"

' Export the chart to the temporary file
oChart.ExportPicture server.MapPath(sFname), "gif", 600, 512

' Create a link to the generated file
Response.Write "<img src='" & sFname & "'>"

' Store the file with its path in the session object for cleanup
Session("sTempFile" & Session("n")) = Server.MapPath(sFname)

' Increment the number of files
Session("n") = Session("n") + 1

%>
0
 
Faheem ShaikhCommented:
You can change color as follows::This example will help you.

 Set chConstants = ChartSpace1.Constants

    Set serSeries1 = ChartSpace1.Charts(0).SeriesCollection(0)
    Set serSeries2 = ChartSpace1.Charts(0).SeriesCollection(1)

    ' Set the interior fill of the first series to a two-color gradient.
    serSeries1.Interior.SetTwoColorGradient chConstants.chGradientDiagonalDown, _
               chConstants.chGradientVariantCenter, "Blue", "Silver"

    ' Set the interior fill of the second series to a solid color.
    serSeries2.Interior.SetSolid "Purple"

    ' Set the interior fill of the plot area to a preset texture.
    ChartSpace1.Charts(0).PlotArea.Interior.SetTextured _
               chConstants.chTextureParchment, chConstants.chTile

0
 
intreegAuthor Commented:
I dont have time to work with this today, but I plan on trying it out tomorrow. Let me ask you this though, I need my pie chart to have 8 slices, so will i need to have 8, SeriesCollection's?

And if so I will need to change my 8 arrays to hold the values?
Like :
val1 = 1,0,0,0,0,0,0,0
val2 = 0,1,0,0,0,0,0,0

And one array for the categories (or slices)
cats = Black,Blue,Red,Green,White,Land,MultiColor,Artifact

If you can answer those questions I think I will have it figured out.

TIA!
Intreeg
0
 
intreegAuthor Commented:
Or even better can I use a two-dimensional array for the values?

val(0,0) = 1
val(0,0) = 0
etc..

val(1,0) = 0
val(1,1) = 1
etc...


0
 
intreegAuthor Commented:
I got a chance to through this together real quick, I get a blank chart here are links to the gifs I have created with this:
Pie -> http://discus.gatheringground.com/pie.gif
Line -> http://discus.gatheringground.com/line.gif

Here is the code (minus DB connection stuff):


Function conCardColor(id, tblName)
ccSQL = "SELECT reff_entry FROM reff_entry WHERE "&_
"reffentry_id = " & id
 '&" AND table_name = '" & tblName &"'"
      Set oConColor = oConn.Execute(ccSQL)
      conCardColor = oConColor("reff_entry")
End Function


dim categories(8)
dim BlackVals(8)
dim BlueVals(8)
dim GreenVals(8)
dim WhiteVals(8)
dim RedVals(8)
dim ArtifactVals(8)
dim LandVals(8)
dim MultiVals(8)

'Set all values to 0
For i=0 to Ubound(categories)-1
      BlackVals(i)= 0
      BlueVals(i)= 0
      GreenVals(i)= 0
      WhiteVals(i)= 0
      RedVals(i)= 0
      ArtifactVals(i)= 0
      LandVals(i)= 0
      MultiVals(i)= 0
Next

set oColors = Server.CreateObject("ADODB.RecordSet")
oColors.Open "SELECT * FROM reff_entry WHERE reff_id = 9",oConn,2,3

i=0
Do While NOT oColors.EOF
      categories(i) = oColors("reff_entry")
      i=i+1
oColors.MoveNext
Loop

oColors.Close

numCards = Request("numCards")

CardsSQL = "SELECT num2c FROM item WHERE "

For i=0 to numCards-1
      CardsSQL = CardsSQL & "product_id = " & Request.Form("product"&i) &" "
      If i <> numCards-1 Then
            CardsSQL = CardsSQL & "OR "
      Else
            CardsSQL = CardsSQL & ";"
      End If
Next

objRst.Open CardsSQL
Do While Not objRst.EOF
      Select Case conCardColor(objRst("num2c"),"Color")            
            Case "Black"
                  BlackVals(0) = BlackVals(0) + 1
            Case "Blue"
                  BlueVals(1) = BlueVals(1) + 1
            Case "Green"
                  GreenVals(2) = GreenVals(2) + 1                  
            Case "White"
                  WhiteVals(3) = WhiteVals(3) + 1                  
            Case "Red"
                  RedVals(4) = RedVals(4) + 1                  
            Case "Artifact"
                  ArtifactVals(5) = ArtifactVals(5) + 1                                                      
            Case "Land"
                  LandVals(6) = LandVals(6) + 1            
            Case "Multicolor"
                  MultiVals(7) = MultiVals(7) + 1      
            Case Else
      End Select                                    
objRst.MoveNext
Loop

' Create a Chart Object
Set oChart = CreateObject("OWC10.ChartSpace")
Set c = oChart.Constants

' Set the different parameters for the ChartSpace
oChart.Border.Color = c.chColorNone
oChart.Charts.Add
oChart.Charts(0).Type = c.chChartTypePie
oChart.Charts(0).HasLegend = True
oChart.Charts(0).HasTitle = False


For i=0 to Ubound(categories)-1
      oChart.Charts(0).SeriesCollection.Add
      oChart.Charts(0).SeriesCollection(i).Caption = sCaption1
      oChart.Charts(0).SeriesCollection(i).SetData c.chDimCategories, c.chDataLiteral, Categories
      
      Select Case categories(i)      
            Case "Black"
                  oChart.Charts(0).SeriesCollection(i).SetData  c.chDimValues,  c.chDataLiteral, BlackVals
                  oChart.Charts(0).SeriesCollection(i).Interior.SetSolid  categories(i)
            Case "Blue"
                  oChart.Charts(0).SeriesCollection(i).SetData  c.chDimValues,  c.chDataLiteral, BlueVals
                  oChart.Charts(0).SeriesCollection(i).Interior.SetSolid categories(i)
            Case "Green"
                  oChart.Charts(0).SeriesCollection(i).SetData  c.chDimValues,  c.chDataLiteral, GreenVals      
                  oChart.Charts(0).SeriesCollection(i).Interior.SetSolid categories(i)             
            Case "White"
                  oChart.Charts(0).SeriesCollection(i).SetData  c.chDimValues,  c.chDataLiteral, WhiteVals
                  oChart.Charts(0).SeriesCollection(i).Interior.SetSolid categories(i)             
            Case "Red"
                  oChart.Charts(0).SeriesCollection(i).SetData  c.chDimValues,  c.chDataLiteral, RedVals      
                  oChart.Charts(0).SeriesCollection(i).Interior.SetSolid categories(i)       
            Case "Artifact"
                  oChart.Charts(0).SeriesCollection(i).SetData  c.chDimValues,  c.chDataLiteral, ArtifactVals
                  oChart.Charts(0).SeriesCollection(i).Interior.SetSolid "Gray"                                                      
            Case "Land"
                  oChart.Charts(0).SeriesCollection(i).SetData  c.chDimValues,  c.chDataLiteral, LandVals      
                  oChart.Charts(0).SeriesCollection(i).Interior.SetSolid "Brown"
            Case "Multicolor"
                  oChart.Charts(0).SeriesCollection(i).SetData  c.chDimValues,  c.chDataLiteral, MultiVals      
                  oChart.Charts(0).SeriesCollection(i).Interior.SetSolid "Yellow"
            Case Else
      End Select      
Next


deckName = Replace(Replace(Replace(Request("deckName")," ",""),"!",""),"?","")

strFileName = "temp-" & deckName & "-ColorChart-" & Second(Now())& ".gif"

sFullFileName = Server.MapPath(".") & "\temp\" & strFileName

response.write sFullFileName

oChart.ExportPicture sFullFileName, "gif", 250, 200
%>

0
 
intreegAuthor Commented:
I have worked on this problem for sometime now, even read a book on OWC and there appears to be no well-documented or even possible solution to this problem. I will most likely use a component of some type. As for now, I am using OWC and have no control over what color is assigned to what slice.
0
 
intreegAuthor Commented:
I will close this question and award points to faheem, as his suggestions came very close to solving the problem, as close as you can get I believe. If anyone figures out the solution please feel free to email me : websupport@gatheringground.com
0
 
Faheem ShaikhCommented:
I know that I could'nt help you. Even then you rewarded my efforts.
That was very generous of you. Thankyou very much.
I look forward to help you out in any of your future problems.

     -Faheem
0
 
intreegAuthor Commented:
No problem, I appreciate the effort very much! If I ever get it figured out I will post the final solution here.
0
 
CrazyCCCommented:
From what I understand, you cannot have more than one series collection for a pie chart.  It does not allow for multiple 'pie charts' which is what multiple series would imply.  That is why you get a blank gif image.  I know this is an old post but in case someone else is wondering why that doesn't work there is your explanation.

I have been trying to change the colors and thus far I'm unable to find a solution.  The closest I've come is to omit any color specifications and use the default color scheme (at least the pie sections are different colors, although they are ugly).
0
 
CrazyCCCommented:
I have finally solved this problem.  The solution is found in part of the series collection name space (under charts).  You must set the color for each Point in that series collection to whatever color you want.  Below is the example.

'Set your chart up assigning the chart type, data, etc.
'Step through a loop setting each color for each data point in the seriescollection

For X as integer = 0 to chart(0).seriescollection(0).length - 1
   chart(0).seriescollection(0).points(X).interior.setsolid('Whatever color you want')
Next

This will set each piece to whatever color you assign.  I usually just have an array of colors and inside the setsolid call I place colors(X) where colors is the name of my color array.

I hope this helps other people out there.  After hours of searching and trying different things I finally stumbled across the solution that worked for me.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.