Вызовите разрыв между точками на оси X (MS.Net Chart Controls, Столбчатая диаграмма)

У меня есть столбчатая диаграмма с несколькими рядами каждый содержащий несколько точек. В настоящее время столбцы все касаются друг друга. Я хочу вызвать разрыв между каждым столбцом. Как я могу достигнуть этого?

Я нашел что, применив PointWidth (Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();) дает мне разделение между группами значения x, но не между каждой серийной точкой в отдельной группе (в котором я нуждаюсь). Используя пустой ряд распорной детали, как предложено в другом месте не решает проблему.

Current Chart

Я использую.Net 4, VS 2010, веб-приложение. Мой код диаграммы следует:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web.UI;
using System.Web.UI.DataVisualization.Charting;

namespace WebApplication1
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Chart1.ChartAreas.Add("Default");
            Chart1.ChartAreas["Default"].BackColor = Color.White;
            Chart1.ChartAreas["Default"].BackSecondaryColor = Color.AliceBlue;
            Chart1.ChartAreas["Default"].BackGradientStyle = GradientStyle.TopBottom;

            Chart1.BackColor = Color.AliceBlue;
            Chart1.BackSecondaryColor = Color.White;
            Chart1.BackGradientStyle = GradientStyle.TopBottom;
            Chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
            var colors = new List(GetSystemColors().Where(c=>c.Name.StartsWith("Dark")));
            var rng = new Random();
            var start = rng.Next(0, colors.Count - 1);
            for (var c = start; c < start + 6; c++)
            {
                var color = colors[c % colors.Count];
                Chart1.Series.Add(color.Name);
                Chart1.Series[color.Name].BorderColor = color;
                Chart1.Series[color.Name].BorderWidth = 1;
                Chart1.Series[color.Name].Color = Color.FromArgb((int)(255 * .7), color);
                Chart1.Series[color.Name].BackSecondaryColor = Color.White;
                Chart1.Series[color.Name].BackGradientStyle = GradientStyle.TopBottom;
                for (var year = DateTime.Now.AddYears(-5).Year; year < DateTime.Now.Year; year++)
                    Chart1.Series[color.Name].Points.Add(new DataPoint(year, rng.Next(0, 20)));

                Chart1.Series[color.Name]["PointWidth"] = (0.6).ToString();
                //Chart1.Series.Add("Spacer:" + color.Name);
                //Chart1.Series["Spacer:" + color.Name]["PointWidth"] = (0.6).ToString();
            }
            Chart1.Legends.Add("Default");
        }

        static IEnumerable GetSystemColors()
        {
            Type type = typeof(Color);
            return type.GetProperties().Where(info => info.PropertyType == type).Select(info => (Color)info.GetValue(null, null));
        }
    }
}

5
задан Community 8 February 2017 в 14:20
поделиться

1 ответ

Тематическое представление может быть несколько сложным в зависимости от типа созданных представлений и изменений, которые необходимо внести. Просмотрите это введение для Views 2 и убедитесь, что установлен модуль расширенной справки , чтобы получить документацию по Views2 из самого модуля Views2 (после активации модуля расширенной справки появится ссылка на документацию на страницах обзора и редактирования ракурсов).

Вы также можете найти некоторые вопросы/ответы здесь на SO (например, Drupal 6: Как быстро тематизировать вид? ), если искать немного.

-121--3894482-

При отправке Runnable или Callable в службу ExecutingService вы получаете Future взамен. Передайте потоки, зависящие от a1, Future и вызовите Future.get () . Эта операция будет блокироваться до завершения потока.

Так:

ExecutorService exec = Executor.newFixedThreadPool(5);
Runnable a1 = ...
final Future f1 = exec.submit(a1);
Runnable a2 = new Runnable() {
  @Override
  public void run() {
    f1.get();
    ... // do stuff
  }
}
exec.submit(a2);

и так далее.

-121--2089584-

У меня была своя работа дьяволов, воспроизводящая вашу ситуацию. Я хотел помочь, потому что думал, что смогу чему-то научиться, сделав это, но мне нужна ваша разметка, или еще лучше, все решение! Я испытывал трудности при выполнении «Error executing child request for ChartImg.axd», когда пробовал простую страницу с диаграммой. Я обнаружил, что мне нужно добавить обработчик в конфигурационный элемент. Я затем боролся через неудачу загрузки сборки System.Web.DataVisualization, потому что скопированный мной элемент обработчика ссылался на сборку 3.5 DataVisualization, поэтому я изменил ее на 4.0 и, наконец, увидел график. Какая это была работа!

Причина, по которой серия разделителей не создает зазор, заключается в отсутствии значений в этой серии. Обратите внимание на последние две строки кода, которые добавляют нулевые значения к серии разделителей. Это создает желаемый промежуток между другими сериями, но вы также найдете разделитель серии, перечисленные в вашей легенде, если у вас есть один, который уродлив, чтобы сказать меньше всего.

  for (var c = start; c < start + 6; c++)
  {
   var color = colors[c % colors.Count];
   var seriesName = "Series "+ c;//color.Name);
   Chart1.Series.Add(seriesName);
   Chart1.Series[seriesName].BorderColor = color;
   Chart1.Series[seriesName].BorderWidth = 1;
   Chart1.Series[seriesName].Color = Color.FromArgb((int)(255 * .7), color);
   Chart1.Series[seriesName].BackSecondaryColor = Color.FromArgb((int)(255 * .2), color);
   Chart1.Series[seriesName].BackGradientStyle = GradientStyle.TopBottom;
   for (var year = DateTime.Now.AddYears(-5).Year; year < DateTime.Now.Year; year++)
    Chart1.Series[seriesName].Points.Add(new DataPoint(year, rng.Next(0, 20)));

   Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();

   seriesName = "Spacer:" + seriesName;
   Chart1.Series.Add(seriesName);
   Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();
   for (var year = DateTime.Now.AddYears(-5).Year; year < DateTime.Now.Year; year++)
    Chart1.Series[seriesName].Points.Add(new DataPoint(year, 0));
  }

Текст легенды можно установить в космос (NB. пустая последовательность игнорируется, а текст легенды не устанавливается), как показано ниже, но в Легенде по-прежнему отображаются эти серии разделителей.

    Chart1.Series[seriesName].LegendText = " ";

Если вам повезло, вам не нужно будет показывать легенду, или вы можете установить цвета серии разделителей на тот же цвет, что и фон легенды, а текст легенды на места. Это приводит к двойному интервалу в Легенде, который, вероятно, будет приемлемым.

7
ответ дан 14 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: