如何配置柱形图的着色?

时间:2010-07-11 02:40:13

标签: excel visualization openoffice.org spreadsheet

我正在寻找一种自定义柱形图的方法。 Open office和Excel为值为1,2,3,3,2的列生成以下图表。但是,我想生成具有以下属性的图表。

  1. 图表应该有五个小节。
  2. 所有栏杆的高度必须相同。
  3. 图表应根据其值显示颜色条。在此示例中,图表应使用三种颜色,因为有三种不同的值。
  4. 如果你知道任何其他软件包可以自动生成这样的图表,我很乐意尝试一下。

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

1 个答案:

答案 0 :(得分:2)

在Excel中,您无法通过简单的步骤完成此操作。 Excel中唯一的选项是手动更改每列的颜色,或逐点改变颜色,如here所示。我认为通过VBA代码可以实现目标。

我建议使用Microsoft ASP.NET built-in chart control。它将为您提供大量的定制可能性。我会尝试发布一个工作样本。

编辑:

只是设法得到一份工作样本:

这是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>

这是我实施的代码隐藏代码 - 不是防弹,因为它需要更多测试...

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);
            }
        }
    }
}

这是结果图表:

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