Charts: Barras que no muestran el gráfico de barras

Creado en 29 oct. 2016  ·  24Comentarios  ·  Fuente: danielgindi/Charts

Hola,

Desde que actualicé a 3.0, tengo problemas con las barras que no se muestran en el gráfico de barras.

Una barra muestra cuando los datos tienen un solo punto. Si agrego más de un punto, las barras no se muestran.
Esto sucede solo cuando el eje x tiene fechas. si cambio los datos de las fechas para decir un número entero, entonces funciona bien.
Consulte las capturas de pantalla adjuntas.

Una muestra de los datos sería similar a esta
{
"09/04/2012": "245",
"02/05/2013": "227",
"04/07/2013 ':" 234 ",
"08/07/2015": "244",
"10/11/2016": "2254"
}

Gracias,
Beto

1

Como se ve a continuación, ¿no veo las barras en absoluto? ¿Qué parece estar causando esto?
2

bug discussion enhancement ★★★

Comentario más útil

No estoy seguro de si esto ayuda a alguien, pero tuve el mismo problema y lo resolví configurando mis barras al tamaño correcto en relación con el rango del eje x:

let data = BarChartData(dataSets: [dataSet])

let dataSetRange = dataSet.xMax - dataSet.xMin
let availableSpacePerBar = dataSetRange / Double(dataSet.entryCount)
data.barWidth = availableSpacePerBar * 0.8 // 80% of available space

chartView.data = data

Todos 24 comentarios

¿Alguien tiene una solución para esto?
Parece extraño que falten las barras en 3.0. Parece que me falta una llamada o estoy configurando algo, sería muy útil si hubiera una solución para esto.

Gracias,
Beto

¿Cómo lo configuras? El gráfico 3.0 ha rediseñado el eje x, por lo que cambiaron muchas cosas. Si no actualiza su código, es posible que falte. Por ahora, consulte ChartsDemo para ver diferentes demostraciones de gráficos de barras.

Ejecutaré los gráficos de demostración nuevamente y veré si puedo reproducir el problema, pero creo que el problema es similar al otro problema # 1716 abierto.

Permítame responderle una vez que haga algunos cambios y ejecute la demostración de gráficos.

Parece que ciertos valores x están causando problemas.

Gracias,
Beto

Estoy teniendo el mismo problema. Mi eje X muestra correctamente la fecha en formato AAAA-MM-DD pero las barras son invisibles.

@ liuxuan30 ,
esto es lo que básicamente intenté ... Hice algunos cambios en ChartsDemo en 3.0 y está haciendo exactamente lo mismo ...

Hice los siguientes cambios. en lugar de que el valor X sea doble, estoy agregando la fecha y hora desde 1970, que es el valor doble para las fechas.
cambió el formateador xaxis a dd / MM.

También adjuntando el código para BarChartViewController.m de esa manera podría verificarlo.

Vea la captura de pantalla a continuación.
simulator screen shot nov 1 2016 12 22 47 am

BarChartViewController.m.zip

O me falta algo muy simple o esto es un error.

Gracias,
Beto

Hola, no estoy seguro de por qué este problema está cerrado, pero como todos los que han descrito los síntomas aquí y en https://github.com/danielgindi/Charts/issues/1716 , estoy experimentando el mismo error en nuestro proyecto. En resumen, el eje X parece no poder manejar valores grandes, como intervalos de tiempo, y de alguna manera estropea la representación del gráfico.

@sjuvvalapalem el drawDataSets en el renderizador de gráfico de barras para obtener más detalles. Es más fácil depurar de su lado.

BarChartViewController.m.zip
@ liuxuan30 he adjuntado los cambios que hice en mi respuesta anterior.
Todo lo que hice fue, en lugar de duplicar, simplemente agregar el intervalo de tiempo para algunas fechas y, por alguna razón, no muestra las barras.

Creo que esto podría ser un error. Por favor, mire el documento zip adjunto, podría descubrir fácilmente los cambios que hice y eso debería tener sentido.
Mirando el mismo problema para las otras personas, sospecho que esto podría ser un error.
Cualquier ayuda en esto es muy apreciada ya que mi proyecto se está deteniendo por esto en lugar de ser enviado a la tienda de aplicaciones.

Cualquier solución a esto sería de gran ayuda.

Gracias,
Beto

@ liuxuan30 ¿ podría abrir este problema? para que esto tenga más tracción al igual que los otros mencionados.

Gracias,
Beto

Lamento estar ocupado con mi trabajo recientemente, así que no puedo echarle un vistazo a esto muy rápido. Intentará
NSTimeInterval es el doble, lo recuerdo, por lo que no debería afectar ...

@ liuxuan30 sí, es un doble. Con el formateador, las fechas se muestran correctamente. los valores por encima de las barras se muestran correctamente.

Todo funciona, pero las barras no se ven.

Si está ocupado, ¿hay alguien más que pueda investigar este problema / error?

Gracias,
Beto

bien, hice una comprobación rápida.
El rango del eje x es

(lldb) po max - min
34041601.0

Al renderizar, el ancho de barRect es demasiado pequeño:

▿ (30.7373051480045, 132.310035326087, 8.28906013339292e-06, 257.842777173913)
  ▿ origin : (30.7373051480045, 132.310035326087)
    - x : 30.7373051480045
    - y : 132.310035326087
  ▿ size : (8.28906013339292e-06, 257.842777173913)
    - width : 8.28906013339292e-06 //  <-- you won't see it
    - height : 257.842777173913

Entonces no lo ves.
La razón es que x val es demasiado grande, por lo que en prepareBuffer() ,

let barWidthHalf = barData.barWidth / 2.0 // barWidth es 0.9

luego

let left = CGFloat(x - barWidthHalf)
let right = CGFloat(x + barWidthHalf)
barRect.size.width = right - left

es trivial.

@danielgindi parece que necesitamos manejar barWidth para hacer frente a grandes valores. O es por diseño.

El rango x es muy grande, pero solo unas pocas barras; sin embargo, usamos un número codificado para presentar el ancho de la barra, lo que causa problemas. Traté de "normalizar" el barWidth, con errores.

La solución temporal es utilizar unidades de día más grandes, no segundos para los valores de x. O simplemente lo convierte en 1,2,3,4, .. y deja que el formateador lo formatee. En sus datos, sus valores x son más de un año, incluso en días, son 365 barras y la barra también sería delgada.

Otra forma es cambiar barWidth que se ajusten a su rango de valor. Sin embargo, todavía no hay una idea clara de cómo encontrar el número correcto.

Hola,
Tengo exactamente el mismo problema, pero el problema parece estar cerrado sin dar ninguna solución ...
Si utilizo un gráfico de líneas, el gráfico se dibuja correctamente, pero si elijo un gráfico de barras verticales, no aparece ninguna barra.
Para mí, eso NO es una mejora, es un error.

Gracias

configurar BarChartData.barWidth en un valor enorme (~ 10000) resolvió el problema para mí

Solucioné este problema estableciendo un borde
chartDataSet.barBorderColor = UIColor.blue
chartDataSet.barBorderWidth = 30
Espero que ayude

La configuración de barBorderWidth parece solucionar el problema.

¿Alguna solución para este problema? La configuración de barBorderWidth parece funcionar, pero realmente no funciona de la manera correcta porque si solo hay uno o 2 puntos de datos, las líneas son demasiado delgadas (suponiendo que establezca barBorderWidth en 1). Si se establece en un número más alto, todas las barras se unen y se mezclan y no se ven bien.

Cualquier trabajo en esto es muy apreciado.

Trabajar como un encanto !

bars not displaying

Mi análisis:
Esto es un error ... La fecha en el tipo de datos long tiene el valor 1542039314621, significa 12 de noviembre de 2018 Después de formatear usando SimpleDateFormat. Pero x Axis toma primero su valor long , lo que causa problemas. Mi solución es xHelper, en su lugar ingrese un valor grande, xHelper haciendo el índice long tipo de datos implícitamente usando el contador counter++ , al lado de xValue mantenga el long grande

este es un código incorrecto:

String[] month = new String[] {"Jan", "Feb", "Mar", "Aprl"};     
xAxis.setValueFormatter(new MyXAxisValueFormatter(month)); 

Este es un código incorrecto:

 xAxis.setValueFormatter(new IAxisValueFormatter() {
         <strong i="20">@override</strong>
         public String getFormattedValue (float value, AxisBase axis){
              Date dates = new Date((long) value); //take your long value from BarEntry 
              SimpleDateFormat sdf = new SimpleDateFormat("dd/MM");
              return  sdf.format(dates);
              }
}

Este es un código incorrecto:

for (int i = 0; i < xValues.length; i++)
Date date = new Date(xValues[i]);

este es un código incorrecto:

List<Date> dates = new ArrayList<Date>();
for (int i = 0; i< xHelper.length; i++)
dates.add(new Date(xValues[i]));

este código funciona como un encanto:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM"); // as you seen on the picture 
String[] xDates = new String[xHelper.length];
for (int m = 0; m < xHelper.length; m++) 
      xDates[m] = sdf.format(new Date(xValues[m]));

List<String> myDateList = new ArrayList<String>();
for (int n = 0; n < xHelper.length; n++)
      myDateList.add(xDates[n]);

//convert your ArrayList into array
String[] month = (String[]) myDateList.toArray(new String[xHelper.length]);

xAxis.setValueFormatter(new YourXAxisValueFormatter(month));

Este es mi código completo y cuenta todo sobre xValue y xHelper.

public class MyDatabaseHelper {
long xValue
int xHelper, yValues;

//empty constructor
public MyDatabaseHelper(){
}

//constructor
public MyDatabaseHelper(long xValue, int yValues, int xHelper){
         this.xValue = xValue;
         this.yValue = yValue;
         this.xHelper = xHelper;
}

//Method
public long getxValue() {return xValues;}

public int getyValue() {return yValues;}

public int getxHelper() {return xHelper;}
}

siguiente haz esta clase y gracias a Phillip Jahoda

 public class MyXAxisValueFormatter implements IXAxisValueFormatter {
          private String[] mValues;`

          //constructor with array parameter
         public MyAxisValueFormatter(String[] values) {
                this.mValues = values;
          }

         <strong i="9">@override</strong>
         public String getFormattedValue(float value, AxisBase axis) {
              return mValues[(int) value];
         }
}

finalmente haga la clase MainActivity:

public class MainActivity extends AppCompatActivity {

EditText yInput;
Button buttonInsert;
FirebaseDatabase firebaseDatabase;
DatabaseReference reference;
BarChart barChart;
//this is xHelper as counter for indexing x values
int counter = 0;

<strong i="13">@override</strong>
protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        yInput = (EditText) findViewById(R.id.editText);
        insertButton = (Button) findViewById(R.id.buttonInsert);
        firebaseDatabase = FirebaseDatabase.getInstance();
        reference = firebaseDatabase.getReference("ChartTable");
        insert();
  }
     public void insert() {
           buttonInsert.setOnClickListener(new View.OnClickListener() {
                   <strong i="14">@override</strong>
                    public void onClick (View v)
                    String id = reference.push().getKey();
                    long x = new Date().getTime();  //this is big value
                    int y = yInput.getText().toString();

                    // when you click button this counter increase
                    //note: using this counter will make your app being crash on 5 step Granularity
                    //my granularity is setGranularity(5);
                    //this is my problem and i don't know why. so, i have to make the counter start from zero
                    //like this                
                    counter++
                    int c = counter - 1;

                    // input value into class
                    MyDatabaseHelper db = new MyDatabaseHelper(x, y, c);
                    //input method into Firebase Database
                    reference.child(id).setValue(db);
           });
     }

    <strong i="15">@override</strong>
    protected void onStart {
    super.onStart();

                   reference.addValueEventListener(new ValueEventListener() {
                            <strong i="16">@override</strong>
                            public void onDataChange(<strong i="17">@NonNull</strong> DataSnapshot dataSnapshot) {

                                    int count = (int) dataSnapshot.getChildrenCount();
                                    long[] xValues = new long[count];
                                    int[] yValues = new int[count];
                                    int[] xHelper = new int[count];

                                    int index = 0;
                                    for (DataSnapshot myDataSnapshot : dataSnapshot.getChildren()){
                                    MyDatabaseHelper db = myDataSnapshot.getValue(MyDatabaseHelper.class);
                                    xValues[index] = db.getxValue();
                                    yValues[index] = db.getyValue();
                                    xHelper[index] = db.getxHelper();
                                    index++
                                   }

                                   ArrayList<BarEntry> barEntry = new ArrayList<BarEntry>();
                                   for (int i = 0; i < xHelper.length; i++)
                                         barEntry.add(new BarEntry(xHelper[i], yValues[i]));

                                   BarDataSet set1 = new BarDataSet(barEntry, "Project Progress");
                                   set1.setColors(ColorTemplate.VORDIPLOM_COLORS);
                                   set1.setDrawValues(false);                              

                                   ArrayList<IBarDataSet> dataSets =  new ArrayList<>();
                                   dataSets.add(set1);

                                   BarData data = new BarData(dataSets);

                                   XAxis xAxis = barChart.getXAxis();
                                   xAxis.setGranularity(5f);
                                   xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

                                   // input xValues[] into Date using List
                                   SimpleDateFormat sdf = new SimpleDateFormat("dd/MM");
                                   String[] xDates = new String[count];
                                   for (int m =0; m < xValues.length; m++)
                                         xDates[m] = sdf.format(new Date(xValues[m]));

                                  List<String> xDatesList = new ArrayList<String>();
                                  for (int n = 0; n < xDates.length; n++)
                                         xDatesList.add(xDates[n]);

                                  // you cannot insert xDatesList directly into setValueFormatter
                                  //so convert ArrayList into array
                                  String[] month = (String[]) xDatesList.toArray(new String[count]);

                                 //finally
                                 xAxis.setValueFormatter(new MyXAxisValueFormatter(month));
                                //done
                                barChart.getAxisRight().setEnabled(false);
                                barChart.setDragEnabled(true);
                                barChart.setScaleEnabled(true);
                                barChart.setPinchZoom(true);
                                barChart.setDoubleTapToZoomEnabled(false);
                                barChart.setDrawGridBackground(false);
                                barChart.setDragEnabled(true);

                                barChart.setData(data);
                                barChart.invalidate();


                             }
                             <strong i="18">@override</strong>
                             public void onCancelled(<strong i="19">@NonNull</strong> DatabaseError databaseError){
                            }
                   });
    }
} 

Todo está hecho. Y esta es mi descripción:

No uso este código:

String[] month = new String[] {"Jan", "Feb", "Mar", "Aprl"};     
xAxis.setValueFormatter(new MyXAxisValueFormatter(month)); 

porque necesito una entrada dinámica y no quiero escribir "jan", "feb", etc. mi solución:
String[] month = (String[]) myDateList.toArray(new String[xHelper.length]);

myDateList.toArray permiten tomar ArrayList e insertarlo en la matriz.

Y no uso este código porque ->

xAxis.setValueFormatter(new IXAxisValueFormatter {

         <strong i="15">@override</strong>
         public String getFormattedValue(float value, AxisBase axis) {
              Date dates = new Date((long) value)
              SimpleDateFormat sdf = new SimpleDateFormat("dd/MM");
              return sdf.format(dates);
         }
}

porque ese value tomado del eje x que hace que sus barras desaparezcan. mi solución es xHelper así:

ArrayList<BarEntry> barEntry = new ArrayList<BarEntry>();
for (int i=0; i<xHelper.length; i++)
    barEntry.add(new BarEnry(xHelper[i], yValues[i]));

el punto es, xHelper debe contener un valor pequeño para indexar Date

Y este es el secreto:
no ingresas Date usando esto -> String[] month = new String[]{...}; sino myDateList

String[] month = (String[]) myDateList.toArray(new String[xHelper.length]);
xAxis.setValueFormatter(new YourXAxisValueFormatter(month));

@sjuvvalapalem @avitus ¿encontraste alguna solución para esto?

¿Han pasado 2 años desde que se informó de este error y todavía no hay una solución?

¿Puede presentar un PR para solucionar este problema? Lo marqué originalmente added this to To do in 4.0 Release

No estoy seguro de si esto ayuda a alguien, pero tuve el mismo problema y lo resolví configurando mis barras al tamaño correcto en relación con el rango del eje x:

let data = BarChartData(dataSets: [dataSet])

let dataSetRange = dataSet.xMax - dataSet.xMin
let availableSpacePerBar = dataSetRange / Double(dataSet.entryCount)
data.barWidth = availableSpacePerBar * 0.8 // 80% of available space

chartView.data = data

configurar BarChartData.barWidth en un valor enorme (~ 10000) resolvió el problema para mí

Este funciona mejor que https://github.com/danielgindi/Charts/issues/1742#issuecomment -519056482 cuando tienes algunos valores faltantes entre tu rango de datos, es decir. fuente de datos no continua y periódica.

Si tiene valores perdidos en el medio,
Siguiendo el comentario https://github.com/danielgindi/Charts/issues/1742#issuecomment -519056482
Screenshot 2020-05-16 at 12 52 11 PM

establecer BarChartData.barWidth en un valor enorme (~ 10000) parece
Screenshot 2020-05-16 at 12 52 40 PM

Pero ambos funcionan muy bien cuando tienes todos los valores continuos suficientes
IMG_81DD4290AE1B-1

Perdí 3 horas por esto, así que vigílalo. Terminó usando índices.

¿Fue útil esta página
0 / 5 - 0 calificaciones