2009-03-20 16 views
7

Tengo una StackedBar que muestra 5 valores por barra, con el valor de los datos en el medio de cada bloque. Hasta aquí todo bien. Sin embargo, cuando el valor es cero, el valor sigue mostrándose, lo cual es complicado cuando hay muchos ceros.Cómo ocultar la etiqueta del punto de datos cuando el valor es cero en un StackedBar

Me gustaría poder ocultar la etiqueta de cero. ¿Cómo puedo hacer eso?

(supongo que podría hacerlo a lo grande leyendo los datos fila por fila y construyendo el gráfico paso a paso, pero preferiría poder arrojar los resultados de la consulta al control) .

Respuesta

5

Puede ocultar las etiquetas en caso Personalizar:

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; 
      } 
     } 
    } 
} 
2

utilizar un formato de número personalizado que suprime los ceros, algo así como

general ;;;

0.0% ;;;

$ #, ## 0.00 ;;;

0

que tenían el mismo problema y lo resolvió con el siguiente formato de número

[=0]"";0.0% 

La primera parte:

[=0]"" 

significa que: si el valor es igual a cero, se debe mostrar una cadena vacía

La segunda parte:

0.0% 

En este caso específico significa que todos los demás valores se deben mostrar como porcentaje con un decimal. Cualquier formato numérico se puede usar como la segunda parte.

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

se puede utilizar para utilizar el formato predeterminado.

Utilizando VBA sería: solución

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

de Jim no funcionó para mí, pero aquí es cómo lo hice, haciendo uso de una parte de su código - gracias Jim!

  1. En el Diseñador, configure un elemento EmptyPointStyle debajo del elemento Series correspondiente. Esto debería establecer el valor para que no se muestre como una etiqueta, y no en la leyenda.
  2. En el código subyacente, utilice el evento DataBound o Customize para ocultar los puntos cero estableciendo su propiedad IsEmpty en True.

Código:

  1. En el ASPX:

    <Series> 
         <asp:Series ChartType="Pie" Name="Series1" ..etc....> 
          <EmptyPointStyle IsValueShownAsLabel="false" IsVisibleInLegend="false" />    
         </asp:Series> 
        </Series> 
    
  2. En el código subyacente (sí usando VB aquí!):

(Nota:. Tengo que explotar todos los puntos de este gráfico de sectores en particular, así, que no es relevante para esta pregunta, pero lo dejé en, en caso de que ayuda a alguien)

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 
+0

He marcado esto porque convierte a C# point.IsEmpty = true es la clave del éxito, esto es necesario cuando se necesita point.IsValueShownAsLabel = true y luego configurando Series [chartSeries] .LabelFormat = "mm: ss"; – peterincumbria

3

este trabajo perfectamente para mí

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; 
     } 
    } 
    } 
1

esto está funcionando para mí

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 
2

Esto funcionó correctamente (Lo probé por una sola serie)

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; 
    } 
} 
Cuestiones relacionadas