Как скрыть метку точки данных, когда значение равно нулю в StackedBar

У меня есть StackedBar, который показывает 5 значений на бар, при этом значение данных отображается в середине каждого блока. Все идет нормально. Однако, когда значение равно нулю, значение все еще отображается, что беспорядочно, когда много нулей.

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

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


person Little JB    schedule 20.03.2009    source источник


Ответы (7)


Вы можете скрыть метки в событии Customize:

protected void SummaryChart_Customize(object sender, EventArgs e)
{
    //hide label value if zero
    foreach (System.Web.UI.DataVisualization.Charting.Series series in SummaryChart.Series)
    {
        foreach (System.Web.UI.DataVisualization.Charting.DataPoint point in series.Points)
        {
            if (point.YValues.Length > 0 && (double)point.YValues.GetValue(0) == 0)
            {
                point.IsValueShownAsLabel = false;
            }
            else
            {
                point.IsValueShownAsLabel = true;
            }
        }
    }
}
person Community    schedule 08.07.2009

Решение Джима не сработало для меня, но вот как я это сделал, используя часть его кода - спасибо, Джим!

  1. В Designer настройте элемент EmptyPointStyle под соответствующим элементом Series. Это должно сделать так, чтобы значение не отображалось как метка и не отображалось в легенде.
  2. В коде программной части используйте событие DataBound или Customize, чтобы скрыть нулевые точки, задав для их свойства IsEmpty значение True.

Код:

  1. В ASPX:

      <Series>
            <asp:Series ChartType="Pie" Name="Series1" ..etc....>
                <EmptyPointStyle IsValueShownAsLabel="false" IsVisibleInLegend="false" />              
            </asp:Series>
      </Series>
    
  2. В коде позади (да, здесь используется VB!):

(Примечание: я также должен взорвать все точки на этой конкретной круговой диаграмме, что не имеет отношения к этому вопросу, но я оставил его на случай, если это кому-то поможет.)

Protected Sub Chart1_DataBound(sender As Object, e As EventArgs) Handles Chart1.DataBound
    Dim chart As Chart = TryCast(sender, Chart)

    If chart IsNot Nothing Then
        ' Explode all points
        For Each p As DataPoint In chart.Series(0).Points
            p.CustomProperties = "Exploded=true"

            ' Remove zero points
            If p.YValues.Length > 0 AndAlso p.YValues.GetValue(0) = 0 Then
                p.IsEmpty = True
            End If
        Next
    End If
End Sub
person Joe Niland    schedule 29.02.2012
comment
Я отметил это, потому что преобразование в C# point.IsEmpty = true является ключом к успеху, это требуется, когда вам нужно point.IsValueShownAsLabel = true, а затем установка Series[chartSeries].LabelFormat = mm:ss; - person peterincumbria; 08.11.2013

Это работает отлично для меня

  foreach (System.Web.UI.DataVisualization.Charting.Series series in SummaryChart.Series)
  {
    foreach (System.Web.UI.DataVisualization.Charting.DataPoint point in series.Points)
    {
        if (point.YValues.Length > 0 && (double)point.YValues.GetValue(0) == 0)
        {
                point.LegendText = point.AxisLabel;//In case you have legend
                point.AxisLabel = string.Empty;
                point.Label = string.Empty;
        }
    }
  }
person Matelin    schedule 13.09.2012

Используйте собственный числовой формат, который подавляет нули, например

Общий;;;

0.0%;;;

$#,##0.00;;;

person Jon Peltier    schedule 12.11.2009

Это сработало правильно (я тестировал только одну серию)

foreach (System.Windows.Forms.DataVisualization.Charting.DataPoint point in chartShow.Series["S3"].Points)
{
     if (point.YValues.Length > 0 && (double)point.YValues.GetValue(0) == 0)
     {
          point.IsEmpty = true;
     }
     else
     {
          point.IsEmpty = false;
     }
}
person Mohsen    schedule 29.11.2016

это работает для меня

For Each s As Series In Chart1.Series
    For Each dp As DataPoint In s.Points
        If dp.YValues(0) = 0 Then
            dp.IsEmpty = True
        End If
    Next
Next
person Om Prakash    schedule 05.12.2014

У меня была такая же проблема, и я решил ее, используя следующий числовой формат

[=0]"";0.0%

Первая часть:

[=0]""

означает, что: если значение равно нулю, оно должно отображать пустую строку

Вторая часть:

0.0%

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

[=0];General (Standard in some localized versions of Excel)

можно использовать для использования формата по умолчанию.

Используя VBA, это будет:

Dim area as range
'The data area for the chart'
set area = Sheet1.range("A1:B3")
area.NumberFormat = "[=0];General"
person Zen    schedule 21.11.2009