2010-07-11 2 views
1

Je suis à la recherche d'un moyen de personnaliser un graphique à colonnes. Open Office et Excel produisent le graphique suivant pour une colonne avec les valeurs 1, 2, 3, 3, 2. Mais, j'aimerais générer un graphique avec les propriétés suivantes.Comment puis-je configurer la coloration d'un histogramme?

  1. Le diagramme devrait avoir cinq barres.
  2. Toutes les barres doivent avoir la même hauteur.
  3. Le graphique doit colorer les barres en fonction de leurs valeurs. Dans cet exemple, le graphique doit utiliser trois couleurs, car il existe trois valeurs différentes.

Si vous connaissez un autre logiciel capable de générer automatiquement un tel diagramme, je serais heureux de l'essayer.

Column Chart for 1, 2, 3, 3, 2 http://i29.tinypic.com/kclcvn.jpg

+0

Pourquoi voulez-vous un graphique à barres si « Toutes les barres doivent être de la même hauteur. » ?? –

Répondre

2

Dans Excel, vous ne pouvez pas le faire en quelques étapes simples. Les seules options que vous avez dans Excel sont de changer la couleur de chaque colonne manuellement ou de varier la couleur par point comme vous pouvez le voir here. Je pense que par le code VBA vous pouvez y arriver.

Je recommanderais l'utilisation de Microsoft ASP.NET built-in chart control. Cela vous donnera beaucoup de possibilités de personnalisation. Je vais essayer de poster un échantillon de travail.

Edit:

juste réussi à obtenir un échantillon de travail:

Voici le code de la page ASPX:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" 
    CodeBehind="Default.aspx.cs" Inherits="WebApplication2._Default" %> 

<%@ Register assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" namespace="System.Web.UI.DataVisualization.Charting" tagprefix="asp" %> 

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
</asp:Content> 
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 

    <asp:Chart ID="Chart1" runat="server" Width="300px"> 
    <Series> 
     <asp:Series Name="Series1" ChartArea="ChartArea1" MarkerSize="1"> 
      <Points> 
       <asp:DataPoint XValue="1" YValues="1" /> 
       <asp:DataPoint XValue="2" YValues="2" /> 
       <asp:DataPoint XValue="3" YValues="3" /> 
       <asp:DataPoint XValue="4" YValues="3" /> 
       <asp:DataPoint XValue="5" YValues="2" /> 
      </Points> 
     </asp:Series> 
    </Series> 
    <ChartAreas> 
     <asp:ChartArea Name="ChartArea1"> 
     <AxisX Interval = "1"></AxisX> 
     </asp:ChartArea> 
    </ChartAreas> 
</asp:Chart>  

</asp:Content> 

Voici le code code-behind I mis en œuvre - pas une preuve de balle parce que il a besoin de plus de tests ...

public partial class _Default : System.Web.UI.Page 
{ 
    private static Dictionary<System.Drawing.Color, double> dictionary = 
     new System.Collections.Generic.Dictionary<System.Drawing.Color, double>(); 

    private Color CreateRandomColor() 
    { 
     Random randonGen = new Random(); 

     Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255), randonGen.Next(255)); 

     return randomColor; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     FormatChart(); 
    } 

    private bool IsColorUsed(Color color) 
    { 
     return dictionary.Any(kvp => kvp.Key == color); 
    } 

    private void FormatChart() 
    { 
     foreach (var point in Chart1.Series[0].Points) 
     { 
      // Point with same Y value already exist? 
      var sameYValue = dictionary.Any(kvp => kvp.Value == point.YValues.First()); 

      if (sameYValue) 
      { 
       //Getting the Y point... 
       var yValue = dictionary.FirstOrDefault(kvp => kvp.Value == point.YValues.First()); 

       // Applying same color... 
       point.Color = yValue.Key; 
      } 
      else // Different Y value 
      { 
       Color color = CreateRandomColor(); 

       // Getting a new Color that isn't used yet... 
       while (IsColorUsed(color)) 
       { 
        color = CreateRandomColor(); 
       } 

       point.Color = color; 

       dictionary.Add(color, point.XValue); 
      } 
     } 
    } 
} 

Ceci est le diagramme résultant:

alt text http://www.freeimagehosting.net/uploads/22d240b0e0.png

+0

Je ne suis pas un programmeur .NET. Mais, n'hésitez pas à poster une solution pour l'audience .NET. – reprogrammer