Charts: Balken zeigen kein Balkendiagramm

Erstellt am 29. Okt. 2016  ·  24Kommentare  ·  Quelle: danielgindi/Charts

Hallo,

Seit dem Upgrade auf 3.0 habe ich Probleme mit den Balken, die nicht im Balkendiagramm angezeigt werden.

Ein Balken zeigt an, wenn die Daten nur einen Punkt haben. Wenn ich mehr als einen Punkt hinzufüge, werden die Balken nicht angezeigt.
Dies geschieht nur, wenn die X-Achse Daten hat. Wenn ich die Daten von Datumsangaben auf Ganzzahl ändere, funktioniert das einwandfrei.
Bitte beachten Sie die beigefügten Screenshots.

Eine Stichprobe der Daten wäre ähnlich
{
09/04/2012: 245,
02/05/2013: 227,
04/07/2013 ': 234,
"07/08/2015": "244",
11.10.2016: 2254
}}

Vielen Dank,
Bob

1

Wie unten zu sehen, sehe ich die Bars überhaupt nicht? Was scheint das zu verursachen?
2

bug discussion enhancement ★★★

Hilfreichster Kommentar

Ich bin mir nicht sicher, ob dies jemandem hilft, aber ich hatte das gleiche Problem und löste es, indem ich meine Balken auf die richtige Größe im Verhältnis zum Bereich der x-Achse einstellte:

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

Alle 24 Kommentare

Hat jemand eine Lösung dafür?
Es scheint seltsam, dass die Balken in 3.0 fehlen. Sieht so aus, als würde mir entweder ein Anruf fehlen oder ich etwas einstellen. Es wäre super hilfreich, wenn es eine Lösung dafür gibt.

Vielen Dank,
Bob

Wie stellst du es ein? In Diagramm 3.0 wurde die x-Achse neu gestaltet, sodass sich viele Dinge geändert haben. Wenn Sie Ihren Code nicht aktualisieren, fehlt er möglicherweise. In ChartsDemo finden Sie zunächst verschiedene Balkendiagramm-Demos.

Ich werde die Demo-Charts erneut ausführen und prüfen, ob ich das Problem reproduzieren kann, aber ich glaube, das Problem ähnelt dem anderen Problem Nr. 1716, das geöffnet wurde.

Lassen Sie mich auf Sie zurückkommen, sobald ich einige Änderungen vorgenommen und die Charts-Demo ausgeführt habe.

Es scheint, dass bestimmte x-Werte Probleme verursachen.

Vielen Dank,
Bob

Ich habe das gleiche Problem. Meine X-Achse zeigt das Datum korrekt im Format JJJJ-MM-TT an, aber die Balken sind unsichtbar.

@ liuxuan30 ,
Hier ist, was ich im Grunde versucht habe ... Ich habe einige Änderungen am ChartsDemo in 3.0 vorgenommen und es macht genau das gleiche ...

Ich habe die folgenden Änderungen vorgenommen. Anstatt dass der X-Wert ein Doppelwert ist, füge ich die Datumszeit seit 1970 hinzu, die der Doppelwert für die Daten ist.
Der xaxis-Formatierer wurde in dd / MM geändert.

Fügen Sie auch den Code für BarChartViewController.m hinzu, damit Sie ihn überprüfen können.

Siehe den Screenshot unten.
simulator screen shot nov 1 2016 12 22 47 am

BarChartViewController.m.zip

Entweder fehlt mir etwas sehr Einfaches oder das ist ein Fehler.

Vielen Dank,
Bob

Hallo, ich bin nicht sicher, warum dieses Problem geschlossen ist, aber wie jeder, der die Symptome hier und unter https://github.com/danielgindi/Charts/issues/1716 beschrieben hat , tritt in unserem Projekt der gleiche Fehler auf. Kurz gesagt, die X-Achse kann anscheinend keine großen Werte wie Zeitintervalle verarbeiten und bringt das Rendering des Diagramms irgendwie durcheinander.

@sjuvvalapalem das Original ChartsDemo funktioniert gut, oder? Ich kenne den Kontext Ihrer Änderungen nicht. In Abbildung 3.0 sind x-Werte immer doppelt so hoch. Wenn Sie etwas geändert haben, stellen Sie sicher, dass Sie alle zugehörigen Felder ändern. In Ihrem Screenshot fehlen nur die Balken, daher können Sie drawDataSets im Balkendiagramm-Renderer auf weitere Details überprüfen. Es ist einfacher, auf Ihrer Seite zu debuggen.

BarChartViewController.m.zip
@ liuxuan30 Ich habe die Änderungen angehängt, die ich in meiner Antwort zuvor vorgenommen habe.
Alles, was ich getan habe, war, anstelle von Double nur das Nstimeinterval für einige Daten hinzuzufügen und aus irgendeinem Grund werden die Balken nicht angezeigt.

Ich denke, das könnte ein Fehler sein. Bitte schauen Sie sich das beigefügte Zip-Dokument an. Sie können leicht herausfinden, welche Änderungen ich vorgenommen habe, und das sollte Sinn machen.
Wenn ich das gleiche Problem für die anderen Leute betrachte, vermute ich, dass dies ein Fehler sein könnte.
Jede Hilfe hierzu wird sehr geschätzt, da mein Projekt dafür angehalten wird, anstatt an den Appstore weitergeleitet zu werden.

Jede Lösung hierfür würde sehr helfen.

Vielen Dank,
Bob

@ liuxuan30 Könnten Sie bitte diese Ausgabe offen machen? so dass dies mehr Traktion bekommt, genau wie die anderen erwähnten.

Vielen Dank,
Bob

Es tut mir leid, dass ich in letzter Zeit mit meiner Arbeit beschäftigt bin, daher kann ich mir das nicht sehr schnell ansehen. Werde versuchen
Ich erinnere mich, dass NSTimeInterval doppelt ist, daher sollte es keine Auswirkungen haben.

@ liuxuan30 ja, es ist ein Doppel. Mit dem Formatierer werden die Daten korrekt angezeigt. Die Werte über den Balken werden korrekt angezeigt.

Alles funktioniert, aber die Balken werden nicht angezeigt.

Wenn Sie beschäftigt sind, gibt es noch jemanden, der sich mit diesem Problem / Fehler befassen könnte?

Vielen Dank,
Bob

Okay, ich habe einen kurzen Check gemacht.
Der x-Achsenbereich ist

(lldb) po max - min
34041601.0

Beim Rendern ist die barRect-Breite zu klein:

▿ (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

Also siehst du es nicht.
Der Grund ist, dass das x- prepareBuffer() zu groß ist, also in

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

dann

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

es ist trivial.

@danielgindi scheint, als müssten wir mit barWidth umgehen, um mit großen Werten fertig zu werden? Oder es ist beabsichtigt.

Der x-Bereich ist sehr groß, aber nur wenige Balken. Wir verwenden jedoch eine fest codierte Zahl, um die Balkenbreite darzustellen, was zu Problemen führt. Ich habe versucht, die Barbreite, den Buggy, zu "normalisieren".

Die vorübergehende Problemumgehung besteht darin, größere Tageseinheiten zu verwenden, keine Sekunden für x-Werte. Oder Sie verwandeln es einfach in 1,2,3,4, .. und lassen den Formatierer formatieren. In Ihren Daten sind Ihre x-Werte über ein Jahr, selbst in Tagen sind es 365 Balken, und der Balken wäre auch dünn.

Eine andere Möglichkeit besteht darin, barWidth zu ändern, die Ihrem Wertebereich entsprechen. Es ist jedoch noch nicht klar, wie man die richtige Nummer findet.

Hallo,
Ich habe genau das gleiche Problem, aber das Problem scheint geschlossen zu sein, ohne eine Lösung zu geben ...
Wenn ich ein Liniendiagramm verwende, wird das Diagramm korrekt gezeichnet. Wenn ich jedoch ein vertikales Balkendiagramm ausgewählt habe, wird kein Balken angezeigt.
Für mich ist das KEINE Verbesserung, sondern ein Fehler.

Vielen Dank

Das Setzen von BarChartData.barWidth auf einen riesigen Wert (~ 10 000) hat das Problem für mich gelöst

Ich habe dieses Problem umgangen, indem ich eine Grenze gesetzt habe
chartDataSet.barBorderColor = UIColor.blue
chartDataSet.barBorderWidth = 30
Ich hoffe, das hilft

Das Festlegen von barBorderWidth scheint das Problem zu beheben.

Irgendeine Lösung für dieses Problem? Das Festlegen von barBorderWidth scheint zu funktionieren, funktioniert jedoch nicht richtig, da die Linien zu dünn sind, wenn nur ein oder zwei Datenpunkte vorhanden sind (vorausgesetzt, Sie setzen barBorderWidth auf 1). Wenn eine höhere Zahl eingestellt ist, werden alle Balken zusammengefügt und vermischt und sehen nicht gut aus.

Jede Arbeit daran wird sehr geschätzt.

Arbeite wie ein Zauber!

bars not displaying

Meine Analyse:
Dies ist ein Fehler ... Das Datum im Datentyp long hat den Wert 1542039314621, dh den 12. November 2018. Nach der Formatierung mit SimpleDateFormat. Aber x Axis nimmt zuerst den long , was zu Problemen führt. Meine Lösung ist xHelper, stattdessen Eingänge großer Wert, Index xHelper tut long Daten implizit Typen mit Zählern counter++ , neben xValue hält großen long Wert. und dieser Code funktioniert wie ein Zauber

Das ist falscher Code:

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

Das ist falscher Code:

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

Dies ist ein falscher Code:

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

Das ist falscher Code:

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

Dieser Code funktioniert wie ein Zauber:

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));

Dies ist mein vollständiger Code und erzählt alles über xValue und 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;}
}

Als nächstes mache diese Klasse und danke an 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];
         }
}

Machen Sie endlich die MainActivity-Klasse:

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){
                            }
                   });
    }
} 

Es ist alles erledigt. Und das ist meine Beschreibung:

Ich benutze diesen Code nicht:

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

weil ich dynamische Eingabe brauche und nicht "jan", "feb" und so weiter schreiben möchte. meine Lösung:
String[] month = (String[]) myDateList.toArray(new String[xHelper.length]);

myDateList.toArray können Sie ArrayList nehmen und in ein Array einfügen.

Und ich benutze diesen Code nicht, weil ->

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

weil das value von der x-Achse genommen wurde, das dazu führt, dass Ihre Balken verschwinden. Meine Lösung ist xHelper wie folgt:

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

Der Punkt ist, xHelper muss einen kleinen Wert für die Indizierung von Date

Und das ist das Geheimnis:
Sie geben damit nicht Date -> String[] month = new String[]{...}; sondern myDateList

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

@sjuvvalapalem @avitus haben Sie eine Lösung dafür gefunden.

Es ist nun 2 Jahre her, seit dieser Fehler gemeldet wurde, und es gibt immer noch keine Lösung?

Können Sie eine PR einreichen, um dies zu beheben? Ich habe es ursprünglich als added this to To do in 4.0 Release markiert

Ich bin mir nicht sicher, ob dies jemandem hilft, aber ich hatte das gleiche Problem und löste es, indem ich meine Balken auf die richtige Größe im Verhältnis zum Bereich der x-Achse einstellte:

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

Das Setzen von BarChartData.barWidth auf einen riesigen Wert (~ 10 000) hat das Problem für mich gelöst

Dieser funktioniert besser als https://github.com/danielgindi/Charts/issues/1742#issuecomment -519056482, wenn zwischen Ihrem Datenbereich einige Werte fehlen, z. nicht kontinuierliche und periodische Datenquelle.

Wenn Sie dazwischen fehlende Werte haben,
Folgen Sie dem Kommentar https://github.com/danielgindi/Charts/issues/1742#issuecomment -519056482
Screenshot 2020-05-16 at 12 52 11 PM

Das Setzen von BarChartData.barWidth auf einen riesigen Wert (~ 10 000) sieht so aus
Screenshot 2020-05-16 at 12 52 40 PM

Aber beide funktionieren hervorragend, wenn Sie alle ausreichenden kontinuierlichen Werte haben
IMG_81DD4290AE1B-1

Ich habe gerade 3 Stunden dafür verloren, also habe ich ein Auge darauf. Beendet mit der Verwendung von Indizes.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

kwstasna picture kwstasna  ·  3Kommentare

deepumukundan picture deepumukundan  ·  3Kommentare

heumn picture heumn  ·  3Kommentare

guoyutaog picture guoyutaog  ·  3Kommentare

BrandonShega picture BrandonShega  ·  4Kommentare