Диаграмма ASP.NET MVC: как отображать значения в каждом столбце

Я пытаюсь использовать функциональные возможности диаграммы, предоставляемые платформой .NET, но мне нужен результат, который я не могу сделать на самом деле.

Мой код:

string themeChart = @"<Chart>
                      <ChartAreas>
                        <ChartArea Name=""Default"" _Template_=""All"">
                          <AxisY>
                            <LabelStyle Font=""Verdana, 12px"" />
                          </AxisY>
                          <AxisX LineColor=""64, 64, 64, 64"" Interval=""1"">
                            <LabelStyle Font=""Verdana, 12px"" />
                          </AxisX>
                        </ChartArea>
                      </ChartAreas>
                    </Chart>";


 var dataChart = new Chart(width: 1000, height: 300, theme: themeChart).AddSeries(
      chartType: "column",
      xValue: arrayXVal,
      yValues: arrayYVal)
           .AddTitle("ChartTitle")
           .GetBytes("png");

 return File(dataChart, "image/png");

Моя карта похожа на эту картинку. Сейчас

Мне нужно сделать такую ​​диаграмму: введите здесь описание изображения

Значения могут быть над столбцами или «внутри», как на втором изображении.

Большое спасибо!

EDIT: я нашел эту страницу: страница W3School. Вы можете видеть, что есть изображение, которое иллюстрирует то, что мне нужно. Но код не указан...

EDIT 2: я также нашел эту страницу: Отображение данных на диаграмме с помощью веб-страниц ASP.NET (Razor), но код не предоставляется.

Ответ: Благодаря вашим ответам я попытался использовать DataVisualization.Charting и почти без изменений по сравнению с моим предыдущим кодом дал приемлемый результат.

Вы можете найти мой полный код здесь: Bitmap image = new Bitmap(1000, 300); Графика g = Graphics.FromImage(изображение); var chart1 = новый System.Web.UI.DataVisualization.Charting.Chart(); диаграмма1.Ширина = 1000; диаграмма1.Высота = 300; chart1.ChartAreas.Add("XAxis").BackColor = System.Drawing.Color.White; chart1.Titles.Add("Название диаграммы"); chart1.Series.Add("Ось x");

        for (int i = 0; i < 24; i++)
        {
            chart1.Series["xAxis"].Points.AddXY(i + " h", arrayValues[i]);
        }

        chart1.Series["xAxis"].IsValueShownAsLabel = true;
        chart1.Series["xAxis"].LabelForeColor = Color.Black;
        chart1.ChartAreas[0].AxisX.Interval = 1;
        chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.LightGray;
        chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.LightGray;
        chart1.BackColor = Color.White;

        MemoryStream imageStream = new MemoryStream();
        chart1.SaveImage(imageStream, ChartImageFormat.Png);
        chart1.TextAntiAliasingQuality = TextAntiAliasingQuality.High;
        Response.ContentType = "image/png";
        imageStream.WriteTo(Response.OutputStream);
        g.Dispose();
        image.Dispose();
        return null;

Большое спасибо Балти за ответ.

Я отдам награду Балти, потому что это первый и полный ответ.

Я отмечу ответ Адитьи Кумаранчат как «основной ответ», потому что он более подробно описывает шаги, которые необходимо выполнить.


person Nicolas Henrard    schedule 15.09.2014    source источник
comment
класс Chart, это ваша собственная реализация или сторонняя?   -  person Alex Peta    schedule 15.09.2014
comment
@AlexPeta: я использую Chart Helper, он по умолчанию используется в .NET framework (doc: msdn.microsoft.com/en-us/library/)   -  person Nicolas Henrard    schedule 15.09.2014
comment
просто декомпилировал dll и посмотрел на нее. Вы также пробовали метод AddLegend?   -  person Alex Peta    schedule 16.09.2014
comment
Я не могу декомпилировать dll, надеюсь, есть более простой способ сделать то, что я хочу. AddLegend добавляет легенду к правой стороне диаграммы с цветовым кодом, относящимся к данным.   -  person Nicolas Henrard    schedule 16.09.2014
comment
Итак, идея, которую я имею в виду, такова: поскольку функциональность не из коробки, вы должны обернуть ее самостоятельно. И теперь у вас есть 2 варианта, либо сделать это на стороне клиента, либо на стороне сервера. Поскольку клиентская сторона не является чем-то, с чем вы можете работать (SVG или Canvas), вы должны делать это на стороне сервера, и вам нужно декомпилировать DLL, чтобы понять, как создается это изображение и как вы можете вводить/влиять на него своими собственными код.   -  person Alex Peta    schedule 16.09.2014


Ответы (3)


Я понимаю, что вы не хотите трогать код на стороне сервера, но варианты кажутся ограниченными. Я не уверен, что вы можете это сделать, но если вы можете изменить серверную часть, вы обязательно сможете внести эти изменения.

Я сделал это для вас:

  1. Добавьте System.Web.DataVisualization; на ваш сайт MVC.
  2. Добавьте «используя System.Web.UI.DataVisualization.Charting;» к вашему контроллеру.
  3. Включите приведенный ниже код в свой контроллер:

             public ActionResult CreateChart()
             {   
             Bitmap image = new Bitmap(500, 50);
             Graphics g = Graphics.FromImage(image);
             var chart1 = new System.Web.UI.DataVisualization.Charting.Chart();
             chart1.Width = 1000;
             chart1.Height = 300;
             chart1.ChartAreas.Add("xAxis").BackColor = System.Drawing.Color.FromArgb     (64,System.Drawing.Color.White);
             chart1.Series.Add("xAxis");
             chart1.Series["xAxis"].Points.AddY(8);
             chart1.Series["xAxis"].Points.AddY(8);
             chart1.Series["xAxis"].Points.AddY(8);
             chart1.Series["xAxis"].Points.AddY(6);
             chart1.Series["xAxis"].Points.AddY(5);    
             chart1.Series["xAxis"].IsValueShownAsLabel = true;
             chart1.BackColor = Color.Transparent;
             MemoryStream imageStream = new MemoryStream();
             chart1.SaveImage(imageStream, ChartImageFormat.Png);
             chart1.TextAntiAliasingQuality = TextAntiAliasingQuality.SystemDefault;
             Response.ContentType = "image/png";
             imageStream.WriteTo(Response.OutputStream);
             g.Dispose();
             image.Dispose();
             return null;
        }
    
  4. Включите приведенный ниже фрагмент кода в свое представление, где вы хотите увидеть диаграмму.

  5. Now run the code and you will be able to see this.

    введите здесь описание изображения

Настройте параметры по мере необходимости. Надеюсь это поможет.

person Adithya Kumaranchath    schedule 23.09.2014
comment
любая помощь в этом stackoverflow.com/questions/32133293/ - person Nithin Paul; 21.08.2015

Я думаю, вам нужно напрямую взаимодействовать с точками, чтобы добавить значение метки. Надеюсь, этот короткий пример будет кому-то полезен. Он добавляет область диаграммы в код, а не в тему xml, но я уверен, что при необходимости ее можно поменять местами.

public ActionResult Chart()
{
    var chart = new System.Web.UI.DataVisualization.Charting.Chart();
    chart.ChartAreas.Add(new ChartArea());

    // Dummy data
    var data = Enumerable.Range(1, 2).Select(i => new { Name = i.ToString(), Count = i }).ToArray();

    chart.Series.Add(new Series("Data"));
    chart.Series["Data"].ChartType = SeriesChartType.Column;

    for (int x = 0; x < data.Length; x++)
    {
        // Add each point and set its Label
        int ptIdx = chart.Series["Data"].Points.AddXY(
             data[x].Name,
             data[x].Count);
        DataPoint pt = chart.Series["Data"].Points[ptIdx];
        pt.Label = "#VALX: #VALY";
        pt.Font = new System.Drawing.Font("Arial", 12f, FontStyle.Bold);
        pt.LabelForeColor = Color.Green;
    }

    using (MemoryStream ms = new MemoryStream())
    {
        chart.SaveImage(ms, ChartImageFormat.Png);
        return File(ms.ToArray(), "image/png");
    }
}

Тогда в моем представлении бритвы у меня просто есть:

<img alt="alternateText" src="@Url.Action("Chart")" />

Значение pt.Label является своего рода строкой формата и может использовать "#VALX" или "#VALY" для отображения только одного или другого.

person Balthy    schedule 18.09.2014

вы можете добавить это в xml в своем коде, чтобы показать число над каждой точкой данных

<Series>
  <Series Name=""Default"" IsValueShownAsLabel=""true""></Series>
</Series>

затем добавьте имя к серии диаграмм в объекте диаграммы.

var dataChart = new Chart(width: 1000, height: 300, theme: themeChart).AddSeries(
  name:"Default",
  chartType: "column",

имя в вашей серии xml должно совпадать с именем в объекте диаграммы

person Salim Proctor    schedule 15.06.2018