Как я могу настроить цвет диаграммы столбца? - PullRequest
1 голос
/ 11 июля 2010

Я ищу способ настроить столбчатую диаграмму. Open office и Excel создают следующую диаграмму для столбца со значениями 1, 2, 3, 3, 2. Но я хотел бы создать диаграмму со следующими свойствами.

  1. На графике должно быть пять баров.
  2. Все стержни должны быть одинаковой высоты.
  3. Диаграмма должна окрашивать полосы в зависимости от их значений. В этом примере диаграмма должна использовать три цвета, потому что есть три разных значения.

Если вам известен какой-либо другой программный пакет, который может автоматически генерировать такую ​​диаграмму, я был бы рад попробовать.

Столбчатая диаграмма для 1, 2, 3, 3, 2 http://i29.tinypic.com/kclcvn.jpg

1 Ответ

2 голосов
/ 11 июля 2010

В Excel вы не можете сделать это с помощью простых шагов. Единственные параметры, которые у вас есть в Excel - это изменить цвет каждого столбца вручную или изменить цвет по точкам, как вы можете видеть здесь . Я думаю, что с помощью VBA кода вы можете туда попасть.

Я бы порекомендовал использовать Microsoft ASP.NET для управления встроенными диаграммами . Это даст вам много возможностей для настройки. Я постараюсь опубликовать рабочий образец.

Edit:

Только что удалось получить рабочий образец:

Это код страницы 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);
            }
        }
    }
}

Это итоговый график:

альтернативный текст http://www.freeimagehosting.net/uploads/22d240b0e0.png

...