Charts: 棒グラフが表示されない棒

作成日 2016年10月29日  ·  24コメント  ·  ソース: danielgindi/Charts

こんにちは、

3.0にアップグレードして以来、棒グラフに棒が表示されないという問題が発生しています。

1つのバーは、データに1つのポイントしかない場合を示します。 複数のポイントを追加すると、バーが表示されません。
これは、xaxisに日付がある場合にのみ発生します。 データを日付から整数に変更すると、正常に機能します。
添付のスクリーンショットをご覧ください。

データのサンプルはこれに似ています
{{
"2012年9月4日": "245"、
"2013年2月5日": "227"、
"04/07/2013 ':" 234 "、
"2015年7月8日": "244"、
"2016年10月11日": "2254"
}

ありがとう、
ボブ

1

以下に見られるように、私はバーをまったく見ていませんか? これを引き起こしていると思われるものは何ですか?
2

bug discussion enhancement ★★★

最も参考になるコメント

これが誰かに役立つかどうかはわかりませんが、同じ問題が発生し、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

全てのコメント24件

誰かがこれに対する解決策を持っていますか?
3.0でバーが欠落しているのは奇妙に思えます。 電話に出られないか、何かを設定しているようです。これに対する解決策があれば非常に役立ちます。

ありがとう、
ボブ

どのように設定しますか? チャート3.0はx軸を再設計したため、多くのことが変更されました。 コードを更新しないと、コードが欠落している可能性があります。 今のところ、さまざまな棒グラフのデモについては、ChartsDemoを確認してください。

デモチャートを再度実行して、問題を再現できるかどうかを確認しますが、この問題は、開かれた他の問題#1716と同様であると考えています。

変更を加えてチャートデモを実行したら、折り返しご連絡いたします。

特定のx値が問題を引き起こしているようです。

ありがとう、
ボブ

私は同じ問題を抱えています。 X軸はYYYY-MM-DDの形式で日付を正しく表示しますが、バーは表示されません。

@ liuxuan30
これが私が基本的に試したことです... 3.0でChartsDemoにいくつかの変更を加えましたが、まったく同じことをしています...

以下の変更を行いました。 X値がdoubleである代わりに、日付のdouble値である1970年以降の日時を追加しています。
xaxisフォーマッタをdd / MMに変更しました。

また、BarChartViewController.mのコードを添付して、確認できるようにします。

以下のスクリーンショットを参照してください。
simulator screen shot nov 1 2016 12 22 47 am

BarChartViewController.m.zip

非常に単純なものが欠落しているか、これはバグです。

ありがとう、
ボブ

こんにちは、この問題が解決された理由はわかりませんが、こことhttps://github.com/danielgindi/Charts/issues/1716で症状を説明したすべての人と同様に、プロジェクトでも同じバグが発生しています。 つまり、X軸は時間間隔などの大きな値を処理できないようであり、チャートのレンダリングを混乱させます。

@sjuvvalapalem元のChartsDemoは正常に機能しますか? 私はあなたの変更についての文脈を知りません。 チャート3.0では、x値は常に2倍です。 何かを変更した場合は、関連するすべてのフィールドを必ず変更してください。 スクリーンショットにバーがないだけなので、詳細については棒グラフレンダラーでdrawDataSetsを確認できると思います。 あなたの側でデバッグする方が簡単です。

BarChartViewController.m.zip
@ liuxuan30以前の返信で行った変更を添付しました。
私がしたのは、ダブルの代わりに、いくつかの日付にNstimeintervalを追加しただけで、何らかの理由でバーが表示されませんでした。

これはバグかもしれないと思います。 添付のzipドキュメントを見てください。私が行った変更を簡単に理解でき、それは理にかなっているはずです。
他の人の同じ問題を見ると、これはバグの可能性があると思います。
私のプロジェクトはアプリストアにプッシュされるのではなく、このために停止されているので、これに関するどんな助けも大いに感謝されます。

これに対する解決策は大いに役立ちます。

ありがとう、
ボブ

@ liuxuan30この問題をオープンにして

ありがとう、
ボブ

最近仕事で忙しくてすみませんので、すぐにはわかりません。 しようとします
NSTimeIntervalは私が覚えている2倍なので、影響はないはずです。

@ liuxuan30はい、それはダブルです。 フォーマッタを使用すると、日付が正しく表示されます。 バーの上の値は正しく表示されます。

すべてが機能していますが、バーが表示されていません。

あなたが忙しいなら、この問題/バグを調べることができる人は他にいますか?

ありがとう、
ボブ

さて、私は簡単なチェックをしました。
x軸の範囲は

(lldb) po max - min
34041601.0

レンダリング時に、barRectの幅が小さすぎます。

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

だからあなたはそれを見ません。
その理由は、x valが大きすぎるため、 prepareBuffer()では、

let barWidthHalf = barData.barWidth / 2.0 // barWidthは0.9です

その後

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

それは些細なことです。

@danielgindiは、大きな値に対処するためにbarWidthを処理する必要があるようです。 または、それは仕様によるものです。

xの範囲は非常に広いですが、バーは数本ですが、ハードコードされた数値を使用してバーの幅を示しているため、問題が発生します。 バグのあるbarWidthを「正規化」しようとしました。

一時的な回避策は、x値に秒ではなく、より大きな日単位を使用することです。 または、それを1,2,3,4、..に変換して、フォーマッターにフォーマットさせます。 あなたのデータでは、x値は1年以上で、数日でも365バーであり、バーも細いでしょう。

もう1つの方法は、値の範囲に合うようにbarWidthを変更することです。 ただし、正しい番号を見つける方法はまだ明確ではありません。

こんにちは、
私はまったく同じ問題を抱えていますが、問題は解決策を提供せずに閉じられているようです...
折れ線グラフを使用すると、グラフは正しく描画されますが、縦棒グラフを選択すると、棒が表示されません。
私にとって、これは拡張機能ではなく、バグです。

ありがとう

BarChartData.barWidthを巨大な値(〜10000)に設定すると、問題が解決しました

境界線を設定することでこの問題を回避しました
chartDataSet.barBorderColor = UIColor.blue
chartDataSet.barBorderWidth = 30
それが役立つことを願っています

barBorderWidthを設定すると、問題が解決するようです。

この問題の解決策はありますか? barBorderWidthの設定は機能しているように見えますが、データポイントが1つまたは2つしかない場合、線が細すぎるため(barBorderWidthを1に設定したと仮定)、実際には正しく機能しません。 より高い数値に設定すると、すべてのバーが結合されて混ざり合い、見栄えが悪くなります。

これに関するどんな仕事も大いに感謝されます。

チャームのように働く!

bars not displaying

私の分析:
これはバグです... longデータ型の日付の値は1542039314621で、SimpleDateFormatを使用してフォーマットした後の2018年11月12日を意味します。 ただし、x Axisは最初にlong値を取得するため、問題が発生します。 私の解決策はxHelperであり、代わりに大きな値を入力し、xValueが大きなlong値を保持するほかに、カウンターcounter++を使用して暗黙的にインデックスlongデータ型を実行します。 このコードは魅力のように機能します

これは間違ったコードです:

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

これは間違ったコードです:

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

これは間違ったコードです:

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

これは間違ったコードです:

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

このコードは魅力のように機能します。

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

これは私の完全なコードであり、xValueと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;}
}

次にこのクラスを作り、PhillipJahodaに感謝します

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

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

すべてが行われます。 そしてこれは私の説明です:

私はこのコードを使用しません:

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

動的入力が必要で、「jan」や「feb」などを書きたくないからです。 私の解決策:
String[] month = (String[]) myDateList.toArray(new String[xHelper.length]);

myDateList.toArray使用すると、ArrayListを取得して配列に挿入できます。

そして、私はこのコードを使用しません。なぜなら->

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

そのvalueはx軸から取得され、バーが消える原因となるためです。 私の解決策は次のようなxHelperです:

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

重要なのは、 xHelperは、 Dateインデックスを作成するための小さな値が含まれている必要があるということです。

そしてこれが秘密です:
これを使用してDateを入力するのではなく、 String[] month = new String[]{...};が、 myDateList

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

@sjuvvalapalem @avitusこれに対する解決策はありましたか?

このバグが報告されてから2年が経ちましたが、まだ修正されていませんか?

これを修正するためにPRを提出できますか? 私はもともとそれをadded this to To do in 4.0 Releaseマークしました

これが誰かに役立つかどうかはわかりませんが、同じ問題が発生し、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

BarChartData.barWidthを巨大な値(〜10000)に設定すると、問題が解決しました

これは、データ範囲の間にいくつかの欠落値がある場合、つまりhttps://github.com/danielgindi/Charts/issues/1742#issuecomment-519056482よりもうまく機能します。 非連続的かつ定期的なデータソース。

間に欠測値がある場合は、
コメントに続いてhttps://github.com/danielgindi/Charts/issues/1742#issuecomment-519056482
Screenshot 2020-05-16 at 12 52 11 PM

BarChartData.barWidthを巨大な値(〜10000)に設定すると、次のようになります。
Screenshot 2020-05-16 at 12 52 40 PM

しかし、uがすべての十分な連続値を持っている場合、両方ともうまく機能します
IMG_81DD4290AE1B-1

私はこれのためにちょうど3時間を失ったので、それに目を離さないでください。 インデックスを使用して終了しました。

このページは役に立ちましたか?
0 / 5 - 0 評価