Charts: Batang tidak menampilkan diagram batang

Dibuat pada 29 Okt 2016  ·  24Komentar  ·  Sumber: danielgindi/Charts

Hai,

Sejak memutakhirkan ke 3.0, saya mengalami masalah dengan bilah yang tidak muncul di bagan batang.

Satu batang menunjukkan saat data hanya memiliki satu titik. Jika saya menambahkan lebih dari satu poin maka batang tidak akan muncul.
Ini terjadi hanya jika xaxis memiliki tanggal. jika saya mengubah data dari tanggal menjadi integer maka itu berfungsi dengan baik.
Silakan lihat tangkapan layar terlampir.

Contoh datanya akan serupa dengan ini
{
"09/04/2012": "245",
"02/05/2013": "227",
"04/07/2013 ':" 234 ",
"07/08/2015": "244",
"10/11/2016": "2254"
}

Terima kasih,
Bob

1

Seperti yang terlihat di bawah ini, saya tidak melihat bar sama sekali? apa yang tampaknya menyebabkan ini?
2

bug discussion enhancement ★★★

Komentar yang paling membantu

Tidak yakin apakah ini membantu siapa pun, tetapi saya memiliki masalah yang sama dan menyelesaikannya dengan mengatur batang saya ke ukuran yang benar relatif terhadap kisaran sumbu 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

Semua 24 komentar

Adakah yang punya solusi untuk ini?
Tampaknya aneh bahwa bilah hilang di 3.0. Sepertinya saya melewatkan panggilan atau menyetel sesuatu, akan sangat membantu jika ada solusi untuk ini.

Terima kasih,
Bob

Bagaimana Anda menyiapkannya? Bagan 3.0 telah mendesain ulang sumbu x, jadi banyak hal yang berubah. Jika Anda tidak memperbarui kode Anda, mungkin kode itu hilang. Untuk saat ini, periksa ChartsDemo untuk mengetahui demo diagram batang yang berbeda.

Saya akan menjalankan grafik Demo lagi dan melihat apakah saya dapat mereproduksi masalah tersebut, tetapi saya yakin masalah tersebut mirip dengan masalah lain yang dibuka # 1716.

Izinkan saya menghubungi Anda kembali setelah saya membuat beberapa perubahan dan menjalankan Demo Charts.

Tampaknya nilai x tertentu menyebabkan masalah.

Terima kasih,
Bob

Saya mempunyai masalah yang sama. Sumbu X saya menunjukkan tanggal dengan benar dalam format YYYY-MM-DD tetapi bilah tidak terlihat.

@ liux30 ,
inilah yang pada dasarnya saya coba ... Saya membuat beberapa perubahan pada ChartsDemo di 3.0 dan itu melakukan hal yang persis sama ...

Saya membuat perubahan berikut. alih-alih nilai X menjadi ganda, saya menambahkan datetime sejak 1970 yang merupakan nilai ganda untuk tanggal.
mengubah pemformat xaxis menjadi dd / MM.

Juga melampirkan kode untuk BarChartViewController.m dengan cara itu Anda bisa memeriksanya.

Lihat gambar di bawah.
simulator screen shot nov 1 2016 12 22 47 am

BarChartViewController.m.zip

Entah saya melewatkan sesuatu yang sangat sederhana atau ini adalah bug.

Terima kasih,
Bob

Hai, Saya tidak yakin mengapa masalah ini ditutup, tetapi seperti semua orang yang telah menjelaskan gejalanya di sini dan di https://github.com/danielgindi/Charts/issues/1716 , saya mengalami bug yang sama dalam proyek kami. Singkatnya, sumbu X tampaknya tidak dapat menangani nilai besar seperti interval waktu, dan entah bagaimana mengacaukan rendering grafik.

@sjuvvalapalem , drawDataSets dalam penyaji bagan batang untuk lebih jelasnya. Lebih mudah untuk men-debug di pihak Anda.

BarChartViewController.m.zip
@ liuxuan30 saya telah melampirkan perubahan yang saya buat di balasan saya sebelumnya.
Yang saya lakukan hanyalah menambahkan dua kali interval Nstime untuk beberapa tanggal dan untuk beberapa alasan tidak menunjukkan bilah.

Saya pikir ini bisa jadi bug. Silakan lihat dokumen zip terlampir, Anda dapat dengan mudah mengetahui perubahan yang saya buat dan itu seharusnya masuk akal.
Melihat masalah yang sama untuk orang lain, saya curiga ini mungkin bug.
Bantuan apa pun dalam hal ini sangat dihargai karena proyek saya dihentikan untuk ini alih-alih didorong ke appstore.

Solusi apa pun untuk ini akan sangat membantu.

Terima kasih,
Bob

@ liuxuan30 dapatkah Anda menjadikan terbitan ini Terbuka? sehingga ini mendapat lebih banyak daya tarik seperti yang disebutkan lainnya.

Terima kasih,
Bob

Saya minta maaf karena saya sibuk dengan pekerjaan saya akhir-akhir ini, jadi saya tidak bisa melihat ini dengan cepat. Akan mencoba
Saya ingat NSTimeInterval berlipat ganda, jadi seharusnya tidak berdampak ..

@ liuxuan30 ya, ini ganda. Dengan formatter, tanggal muncul dengan benar. nilai di atas batang ditampilkan dengan benar.

Semuanya berfungsi tetapi bilah tidak muncul.

Jika Anda sibuk, Apakah ada orang lain yang dapat menyelidiki masalah / bug ini?

Terima kasih,
Bob

baiklah, saya melakukan pemeriksaan cepat.
Rentang sumbu x adalah

(lldb) po max - min
34041601.0

Saat merender, lebar barRect terlalu kecil:

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

Jadi Anda tidak melihatnya.
Alasannya, x val terlalu besar, jadi di prepareBuffer() ,

biarkan barWidthHalf = barData.barWidth / 2.0 // barWidth adalah 0,9

kemudian

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

itu sepele.

@danielgindi sepertinya kita perlu menangani barWidth untuk mengatasi nilai-nilai besar? Atau dengan desain.

Rentang x sangat besar, tetapi hanya beberapa batang, namun kami menggunakan nomor kode keras untuk menampilkan lebar batang, yang menyebabkan masalah. Saya mencoba untuk "menormalkan" barWidth, buggy.

Solusi sementara adalah menggunakan satuan hari yang lebih besar, bukan detik untuk nilai x. Atau Anda hanya mengubahnya menjadi 1,2,3,4, .. dan biarkan formatter untuk memformat. Dalam data Anda, x vals Anda lebih dari satu tahun, bahkan dalam hitungan hari, ada 365 batang dan batangnya juga akan menipis.

Cara lain adalah mengubah barWidth yang sesuai dengan rentang nilai Anda. Namun, belum ada gambaran yang jelas bagaimana menemukan nomor yang tepat.

Hai,
Saya memiliki masalah yang sama persis, tetapi masalah tersebut tampaknya ditutup tanpa memberikan solusi apa pun ...
Jika saya menggunakan diagram garis, diagram digambar dengan benar tetapi jika saya memilih diagram batang vertikal, tidak ada batang yang muncul.
Bagi saya, itu BUKAN peningkatan, itu bug.

Terima kasih

pengaturan BarChartData.barWidth ke nilai yang sangat besar (~ 10.000) memecahkan masalah bagi saya

Saya mengatasi masalah ini dengan menetapkan perbatasan
chartDataSet.barBorderColor = UIColor.blue
chartDataSet.barBorderWidth = 30
Semoga membantu

Menyetel barBorderWidth tampaknya memperbaiki masalah tersebut.

Ada solusi untuk masalah ini? Menyetel barBorderWidth tampaknya berfungsi tetapi tidak benar-benar berfungsi dengan benar karena jika hanya ada satu atau 2 titik data, garisnya terlalu tipis (dengan asumsi Anda menyetelnya ke barBorderWidth ke 1). Jika diatur ke angka yang lebih tinggi maka semua batang digabungkan dan bercampur bersama dan tidak terlihat bagus.

Pekerjaan apa pun tentang ini sangat dihargai.

Bekerja Seperti Pesona!

bars not displaying

Analisis Saya:
Ini bug ... Tanggal di long tipe data bernilai 1542039314621, artinya 12 November 2018 Setelah diformat menggunakan SimpleDateFormat. Tetapi x Axis mengambil nilai long terlebih dahulu, yang menyebabkan masalah. Solusi saya adalah xHelper, sebagai gantinya masukkan nilai besar, xHelper melakukan indeks long tipe data secara implisit menggunakan penghitung counter++ , di samping xValue tahan nilai besar long . dan kode ini bekerja dengan sangat baik

ini adalah kode yang salah:

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

Ini adalah kode yang salah:

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

Ini adalah kode yang salah:

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

ini adalah kode yang salah:

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

kode ini bekerja seperti pesona:

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

Ini adalah kode lengkap saya dan menceritakan semuanya tentang xValue dan 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;}
}

selanjutnya buatlah kelas ini dan terima kasih kepada 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];
         }
}

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

Semuanya sudah selesai. Dan ini adalah Deskripsi saya:

Saya tidak menggunakan kode ini:

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

karena saya membutuhkan input dinamis dan tidak ingin menulis "jan", "feb" dan lain sebagainya. solusi saya:
String[] month = (String[]) myDateList.toArray(new String[xHelper.length]);

myDateList.toArray memungkinkan Anda untuk mengambil ArrayList dan memasukkannya ke dalam array.

Dan saya tidak menggunakan kode ini karena ->

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

karena value diambil dari x Axis yang menyebabkan Bar-mu menghilang. solusi saya adalah xHelper seperti ini:

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

intinya adalah, xHelper harus mengandung nilai kecil untuk mengindeks Date

Dan inilah rahasianya:
Anda tidak memasukkan Date menggunakan ini -> String[] month = new String[]{...}; tetapi myDateList

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

@sjuvvalapalem @avitus apakah Anda menemukan solusi untuk ini.

Sudah 2 tahun sejak bug ini dilaporkan, dan masih belum ada perbaikan?

dapatkah Anda mengajukan PR untuk memperbaikinya? Saya awalnya menandainya added this to To do in 4.0 Release

Tidak yakin apakah ini membantu siapa pun, tetapi saya memiliki masalah yang sama dan menyelesaikannya dengan mengatur batang saya ke ukuran yang benar relatif terhadap kisaran sumbu 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

pengaturan BarChartData.barWidth ke nilai yang sangat besar (~ 10.000) memecahkan masalah bagi saya

Yang ini bekerja lebih baik daripada https://github.com/danielgindi/Charts/issues/1742#issuecomment -519056482 ketika Anda memiliki beberapa nilai yang hilang di antara rentang data Anda, yaitu. sumber data non kontinyu dan periodik.

Jika Anda memiliki nilai yang hilang di antaranya,
Mengikuti komentar https://github.com/danielgindi/Charts/issues/1742#issuecomment -519056482
Screenshot 2020-05-16 at 12 52 11 PM

pengaturan BarChartData.barWidth ke nilai yang sangat besar (~ 10.000) sepertinya
Screenshot 2020-05-16 at 12 52 40 PM

Tetapi keduanya bekerja dengan baik ketika Anda memiliki semua nilai berkelanjutan yang memadai
IMG_81DD4290AE1B-1

Saya baru saja kehilangan 3 jam untuk ini, jadi awasi. Diakhiri dengan menggunakan indeks.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat