Click here to Skip to main content
15,881,173 members
Articles / Desktop Programming / Windows Forms
Article

C# 3D Charting

Rate me:
Please Sign up or sign in to vote.
4.72/5 (58 votes)
24 May 20062 min read 217.2K   9.9K   201   40
A simple article for easy charting.

Image 1

Introduction

I want to begin with a special thanks to CodeProject for providing so many useful samples, and thanks especially to the author of this article: Customizing the .NET Panel control.

Background

If you know about the EBP products, then you'll remember their main board with a simple but cool isometric 3D chart. So, let's do the same here. All the code has been verified under Microsoft FxCop 1.35.

I'm not very comfortable in writing articles even in French, so English isn't better ;p.

Using the code

Let's see the creation code:

C#
// Object declaration
Nolme.WinForms.Chart m_chartSample1;

// Create object
this.m_chartSample1 = new Nolme.WinForms.Chart(this.components);
this.m_chartSample1.BackColor = System.Drawing.Color.Silver;
this.m_chartSample1.BottomMargin = 20;
this.m_chartSample1.ColumnFont = new System.Drawing.Font(
                  "Arial", 8F, System.Drawing.FontStyle.Italic);
this.m_chartSample1.ColumnTitleFont = new System.Drawing.Font(
              "Arial", 10F, System.Drawing.FontStyle.Underline);
this.m_chartSample1.Curvature = 15;
this.m_chartSample1.DeltaDepth = 10;
this.m_chartSample1.DisplayHiddenSides = true;
this.m_chartSample1.DisplayTextOnColumns = true;
this.m_chartSample1.GradientMode = 
     System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal;
this.m_chartSample1.LeftMargin = 50;
this.m_chartSample1.LegendFont = new System.Drawing.Font(
                    "Arial", 11F, System.Drawing.FontStyle.Bold);
this.m_chartSample1.Location = new System.Drawing.Point(8, 8);
this.m_chartSample1.MainTitle = "Main title";
this.m_chartSample1.MainTitleFont = new System.Drawing.Font(
    "Arial", 16F, 
    ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | 
                          System.Drawing.FontStyle.Underline))));
this.m_chartSample1.MarginBetweenColumn = 20;
this.m_chartSample1.Name = "m_chartSample1";
this.m_chartSample1.RightMargin = 20;
this.m_chartSample1.Size = new System.Drawing.Size(456, 304);
this.m_chartSample1.TabIndex = 4;
this.m_chartSample1.TopMargin = 20;
this.m_chartSample1.VerticalAxisMaxValue = 10000;
this.m_chartSample1.VerticalAxisStep = 1000;

Adding a column to the chart is done with the following code:

C#
ChartColumn column1 = 
    m_chartSample1.AddColumn (1500, 210, 0, 500);

Each number represents a sub-value in the new column. You can pass an integer array if you have more values.

You can set the column title like this:

C#
column1.Title = "January";

Other attributes like the margins, main title, etc., can be changed.

There were two choices on the legend of the graph. We could either integrate the legend into the current panel, or make another independent object. The main intention is to provide a centralized unique legend if multiple charts are used on the same page.

To summarize, a Chart (derived from CustomPanel) contains one or more CharColumns. A ChartLegend is composed of CharLegendItems. There are as many CharLegendItems as sub-values in a CharColumn.

Points of interest

I've tried to make the code as simple as possible so that anyone can upgrade it.

Bug report

Nothing actually.

History

  • 2006-04-08
    • Thanks timbits214, changes have been done.
    • So, I've added a new mode for 'real time' rendering.
    • Chart.cs has a new method, ShiftLeft, to shift columns from one step to the left.
    • With these changes, ChartColumn integrates a default constructor and ResetValues.
  • 2006-03-31
    • The new version contains a new rendering mode: 3D with gradient.
    • Bug fixed: Left grid text starting at 0.
    • Bug fixed: Vertical axis auto-adjusts when min and max don't have the same digit numbers (100 and 1000, for example).
    • Bug fixed: Border drawings and optimization.
    • Bug fixed: Label on the column with negative values.
    • New function: DisplayBorders in ChartColumn.cs.
    • Some changes have been made in the function parameters list to support gradient drawing mode.
  • 2005-10-07
    • New version contains a new rendering mode. See the ChartRenderingMode enum.
    • Associated to this new mode, ChartCumulativeMode enum can define where a label on the column is placed.
    • Some changes have been made in the function parameters list.
  • 2005-10-08
    • Negative values are now managed.
    • The function AdjustVerticalAxis has been reviewed.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
France France
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionHighlight Column on MouseHover Pin
quicksilver17ro6-May-20 23:53
quicksilver17ro6-May-20 23:53 
GeneralMy vote of 5 Pin
RAJI @Codeproject11-Jul-11 19:28
RAJI @Codeproject11-Jul-11 19:28 
Generalnice chart !it works Pin
batsword11-Nov-10 15:34
batsword11-Nov-10 15:34 
GeneralIt's OK Pin
bluealert45513-Aug-09 15:44
bluealert45513-Aug-09 15:44 
General3d chart plotting Pin
Faysal26-Mar-08 0:16
Faysal26-Mar-08 0:16 
GeneralRe: 3d chart plotting Pin
Vincent DUVERNET (Nolmë Informatique)28-Mar-08 4:10
Vincent DUVERNET (Nolmë Informatique)28-Mar-08 4:10 
GeneralRe: 3d chart plotting Pin
Faysal28-Mar-08 15:08
Faysal28-Mar-08 15:08 
GeneralRe: 3d chart plotting Pin
Vincent DUVERNET (Nolmë Informatique)29-Mar-08 3:40
Vincent DUVERNET (Nolmë Informatique)29-Mar-08 3:40 
Hum, this code render 3D style view (isometric view) but from 2 axis.

So if your datas are coming from 3 axis (X, Y & Z), you'll have a big problem Poke tongue | ;-P

What software are you using ?
If you are under Windows Operating system, you should download Microsoft Visual C# Express Edition 2008 which if free and all your compilation problems will be solved.

++
vincent
GeneralWonderful ! Pin
JulienV3-Sep-07 2:02
JulienV3-Sep-07 2:02 
Generallmd Pin
kurnikov11-Apr-07 6:36
kurnikov11-Apr-07 6:36 
GeneralRe: lmd Pin
Vincent DUVERNET (Nolmë Informatique)13-Apr-07 8:24
Vincent DUVERNET (Nolmë Informatique)13-Apr-07 8:24 
QuestionAdding control to VS? Pin
mikemohr3-Nov-06 7:30
mikemohr3-Nov-06 7:30 
AnswerRe: Adding control to VS? Pin
Vincent DUVERNET (Nolmë Informatique)3-Nov-06 11:30
Vincent DUVERNET (Nolmë Informatique)3-Nov-06 11:30 
QuestionWhat about a web based solution? Pin
Marcus D18-Oct-06 6:22
Marcus D18-Oct-06 6:22 
AnswerRe: What about a web based solution? Pin
Vincent DUVERNET (Nolmë Informatique)18-Oct-06 7:16
Vincent DUVERNET (Nolmë Informatique)18-Oct-06 7:16 
GeneralOne Suggession Pin
jayvardhanpatil28-Sep-06 22:48
jayvardhanpatil28-Sep-06 22:48 
QuestionCool Pin
adityap29-Aug-06 20:14
adityap29-Aug-06 20:14 
AnswerRe: Cool Pin
Vincent DUVERNET (Nolmë Informatique)29-Aug-06 21:09
Vincent DUVERNET (Nolmë Informatique)29-Aug-06 21:09 
GeneralImpressive! Pin
Danilo Corallo20-Jul-06 3:16
Danilo Corallo20-Jul-06 3:16 
GeneralNice Try Pin
Sendilkumar.M24-May-06 18:27
Sendilkumar.M24-May-06 18:27 
GeneralVery Nice Pin
Paul Conrad24-May-06 16:53
professionalPaul Conrad24-May-06 16:53 
GeneralSave & Print Pin
Chestah17-May-06 23:27
Chestah17-May-06 23:27 
GeneralRe: Save & Print Pin
Vincent DUVERNET (Nolmë Informatique)18-May-06 0:26
Vincent DUVERNET (Nolmë Informatique)18-May-06 0:26 
JokeRe: Save & Print Pin
Chestah18-May-06 11:04
Chestah18-May-06 11:04 
Questionlicensing / usage query Pin
SimonS11-Apr-06 5:18
SimonS11-Apr-06 5:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.