[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

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

Posted on 2005-04-18
16
Medium Priority
?
2,676 Views
Last Modified: 2012-06-21
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?
0
Comment
Question by:intreeg
  • 8
  • 5
  • 2
  • +1
16 Comments
 
LVL 9

Expert Comment

by:danataylor
ID: 13808151
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
 
LVL 5

Author Comment

by:intreeg
ID: 13808198
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
 
LVL 5

Author Comment

by:intreeg
ID: 13809206
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
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
LVL 8

Expert Comment

by:Faheem Shaikh
ID: 13827412
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
 
LVL 8

Expert Comment

by:Faheem Shaikh
ID: 13827579
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
 
LVL 8

Expert Comment

by:Faheem Shaikh
ID: 13827596
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
 
LVL 5

Author Comment

by:intreeg
ID: 13827842
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
 
LVL 5

Author Comment

by:intreeg
ID: 13827938
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
 
LVL 5

Author Comment

by:intreeg
ID: 13828367
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
 
LVL 8

Accepted Solution

by:
Faheem Shaikh earned 2000 total points
ID: 13851281
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
 
LVL 5

Author Comment

by:intreeg
ID: 14277537
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
 
LVL 5

Author Comment

by:intreeg
ID: 14277552
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
 
LVL 8

Expert Comment

by:Faheem Shaikh
ID: 14277994
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
 
LVL 5

Author Comment

by:intreeg
ID: 14278078
No problem, I appreciate the effort very much! If I ever get it figured out I will post the final solution here.
0
 

Expert Comment

by:CrazyCC
ID: 38111164
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
 

Expert Comment

by:CrazyCC
ID: 38111282
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

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I have helped a lot of people on EE with their coding sources and have enjoyed near about every minute of it. Sometimes it can get a little tedious but it is always a challenge and the one thing that I always say is:   The Exchange of informatio…
I was asked about the differences between classic ASP and ASP.NET, so let me put them down here, for reference: Let's make the introductions... Classic ASP was launched by Microsoft in 1998 and dynamically generate web pages upon user interact…
Exchange organizations may use the Journaling Agent of the Transport Service to archive messages going through Exchange. However, if the Transport Service is integrated with some email content management application (such as an anti-spam), the admin…
When cloud platforms entered the scene, users and companies jumped on board to take advantage of the many benefits, like the ability to work and connect with company information from various locations. What many didn't foresee was the increased risk…
Suggested Courses
Course of the Month18 days, 7 hours left to enroll

829 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question