2016-04-14 1 views
2

я создал гистограмму в моем приложении, которое выглядит следующим образом:Make Chart Legend представляет два цвета

Column chart with positive and negative colors

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

То, что я уже пробовал:

Я добавил CustomItems к Legend. Вот код:

Legend currentLegend = chart.Legends.FindByName(chart.Series[series].Legend); 
if (currentLegend != null) 
{ 
    currentLegend.LegendStyle = LegendStyle.Table; 
    LegendItem li    = new LegendItem(); 
    li.Name      = series; 
    li.Color     = Color.Red; 
    li.BorderColor    = Color.Transparent; 
    currentLegend.CustomItems.Add(li); 
} 

Это приводит к следующему представлению:

Column chart with legend representing positive and negative color

Я мог бы жить с этим. Но как только я добавляю дальнейшие ряды к диаграмме, порядок элементов уничтожается. Вот пример:

enter image description here

Я хотел бы иметь один из двух вариантов:

  1. сохранить положительные и отрицательные цвета вместе
  2. или даже лучшим решением может быть, чтобы иметь только одна плитка в легенде, которая двойного цвета. Что-то вроде этого:

enter image description here

Не могли бы вы помочь мне решить эту проблему?

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

ответ

2

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

См. here for an example, что делает это; примечание в частности расположение ..!

Но, может быть, вы можете уйти немного легче; Смотри ниже!

Первое правило, чтобы понять, что добавлено LegendItems всегда перейти к концу из списка. Поэтому вы не можете держать их вместе, если только ваши добавленные Series не начинаются с . Вы можете сделать это с помощью Series.Insert(..), но с использованием этих двухцветных прямоугольников намного приятнее, imo ..

Чтобы показать графику, которые вы хотите, просто создать их как растровые изображения, либо на диске или на лету и хранить их в Images коллекции графика:

Legend L = chart1.Legends[0]; 
Series S = chart1.Series[0]; 

// either load an image from disk (or resources) 
Image img = Image.FromFile(someImage); 

// or create it on the fly: 
Bitmap bmp = new Bitmap(32, 14); 
using (Graphics G = Graphics.FromImage(bmp)) 
{ 
    G.Clear(Color.Red); 
    G.FillPolygon(Brushes.LimeGreen, new Point[] { new Point(0,0), 
     new Point(32,0), new Point(0,14)}); 
} 

Теперь добавьте его в NamedImage коллекции графика :

chart1.Images.Add(new NamedImage("dia", bmp)); 

Теперь вы можете создать столько LegendItems, сколько вам нужно:

LegendItem newItem = new LegendItem(); 
newItem.ImageStyle = LegendImageStyle.Rectangle; 
newItem.Cells.Add(LegendCellType.Image, "dia", ContentAlignment.MiddleLeft); 
newItem.Cells.Add(LegendCellType.Text, S.Name, ContentAlignment.MiddleLeft); 

и добавить их к Legend:

L.CustomItems.Add(newItem); 

К сожалению, вы не можете удалить исходный пункт.

Что вы можете сделать, помимо создания нового Legend с нуля, это:

Очистить текст так:

S.LegendText = " "; // blank, not empty! 

Как Вы установили Colors из все в DataPoints все равно , вы также можете избавиться от синего прямоугольника:

S.Color = Color.Transparent; 

Это будет также сделать все точки без цветов прозрачными, поэтому обязательно покрасьте их все!

Обратите внимание, что некоторые пространство в Легенде это все еще снято!

Вот результат, с несколькими цветными точками и добавили ряд линия:

enter image description here

+0

Большое спасибо, что помогли! – Konstantin