当前位置: 首页 > 知识库问答 >
问题:

MPAndroidChart时间图表x轴未显示所有值

羊舌青青
2023-03-14

我正在开发一个应用程序,其中我使用了MPAndroidChart。它显示特定月份的特定值。数据如下:

1430418600000, 130.279999\n1433097000000, 125.43\n1435689000000, 121.300003\n1438540200000, 112.760002\n1441045800000, 110.300003\n1443637800000, 119.50\n1446402600000, 118.300003\n1448908200000, 105.260002\n1451845800000, 97.339996\n1454265000000, 96.690002\n1456770600000, 108.989998\n1459449000000, 93.739998\n1462127400000, 99.860001\n1464719400000, 95.599998\n1467311400000, 104.209999\n1469989800000, 106.099998\n1472668200000, 113.050003\n1475433000000, 113.540001\n1477938600000, 110.519997\n1480530600000, 115.82\n1483381800000, 121.349998\n1485887400000, 136.990005\n1488306600000, 143.660004\n1491157800000, 143.649994

现在,Y轴显示了所提供的最大和最小点,而x轴仅显示了6个点。

图表初始化代码:

Cursor cursor = getContentResolver().query(Contract.Quote.makeUriForStock(quote_symbol),
            Contract.Quote.QUOTE_COLUMNS.toArray(new String[]{}),
            null, null, Contract.Quote.COLUMN_SYMBOL);

if(cursor!=null)
{
    cursor.moveToNext();
}
chart = (LineChart) findViewById(R.id.chart);

// no description text
chart.getDescription().setEnabled(false);

// enable touch gestures
chart.setTouchEnabled(true);

chart.setDragDecelerationFrictionCoef(0.9f);

// enable scaling and dragging
chart.setDragEnabled(true);
chart.setScaleEnabled(false);
chart.setDrawGridBackground(false);
chart.setHighlightPerDragEnabled(true);

// set an alternative background color
chart.setBackgroundColor(Color.WHITE);
chart.setViewPortOffsets(0f, 0f, 0f, 0f);
chart.setScaleXEnabled(true);

;
// set data
chart.setData(prepareLineData(cursor));

// do not forget to refresh the chart
chart.invalidate();
chart.animateX(750);

准备图表数据:

private LineData prepareLineData(Cursor cursor)
{
    String historyData=cursor.getString(cursor.getColumnIndex(Contract.Quote.COLUMN_HISTORY));
    String maxValueString=cursor.getString(cursor.getColumnIndex(Contract.Quote.COLUMN_HISTORY_MAX_VALUE));
    String maxDateString=cursor.getString(cursor.getColumnIndex(Contract.Quote.COLUMN_HISTORY_MAX_DATE));
    String minValueString=cursor.getString(cursor.getColumnIndex(Contract.Quote.COLUMN_HISTORY_MIN_VALUE));
    String minDateString=cursor.getString(cursor.getColumnIndex(Contract.Quote.COLUMN_HISTORY_MIN_DATE));

    String[] historyDataArray=historyData.split("\n");
    ArrayList<Entry> e1 = new ArrayList<>();

    for (int i = 0; i < historyDataArray.length; i++) {
        String[] historyDataValues=historyDataArray[i].split(",");
        e1.add(new Entry(Float.parseFloat(historyDataValues[0]), Float.parseFloat(historyDataValues[1])));
    }

    Typeface mTf = Typeface.createFromAsset(this.getAssets(), "OpenSans-Regular.ttf");


    XAxis xAxis = chart.getXAxis();
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);
    xAxis.setTypeface(mTf);
    xAxis.setTextSize(10f);
    xAxis.setTextColor(Color.WHITE);
    xAxis.setDrawAxisLine(false);
    xAxis.setDrawGridLines(true);
    xAxis.setTextColor(Color.rgb(255, 192, 56));
    xAxis.setCenterAxisLabels(true);
    xAxis.setAxisMaximum(Float.parseFloat(maxDateString));
    xAxis.setAxisMinimum(Float.parseFloat(minDateString));
    xAxis.setAvoidFirstLastClipping(true);
    xAxis.setValueFormatter(new IAxisValueFormatter() {
        private SimpleDateFormat mFormat = new SimpleDateFormat("MMM,yy");
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return mFormat.format(new Date((long) value));
        }
    });
    YAxis leftAxis = chart.getAxisLeft();
    leftAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);
    leftAxis.setTypeface(mTf);
    leftAxis.setTextColor(ColorTemplate.getHoloBlue());
    leftAxis.setDrawGridLines(false);
    leftAxis.setGranularityEnabled(true);
    leftAxis.setAxisMinimum(0f);
    leftAxis.setAxisMaximum(Float.parseFloat(maxValueString)); 
    leftAxis.setTextColor(Color.rgb(255, 192, 56));
    YAxis rightAxis = chart.getAxisRight();
    rightAxis.setEnabled(false);
    LineDataSet d1 = new LineDataSet(e1, "Price");
    d1.setLineWidth(2.5f);
    d1.setAxisDependency(YAxis.AxisDependency.LEFT);
    d1.setHighLightColor(Color.rgb(244, 117, 117));
    d1.setDrawValues(false);
    ArrayList<ILineDataSet> sets = new ArrayList<>();
    sets.add(d1);
    return new LineData(sets);
}

共有1个答案

李法
2023-03-14

MPAndroidChart计算要自动显示的标签。

如果要在特定位置显示标签,可以使用库的修改版本。

请参见下面的示例:

leftAxis.setShowSpecificLabelPositions(true);
leftAxis.setSpecificLabelPositions(new float[]{0, 10, 20, 50, 100, 300});

您可以在这里下载库:https://github.com/philippeauriach/MPAndroidChart/tree/custom-labels

 类似资料:
  • 我使用MPAndroidChart条形图(分组数据集)显示两个用户的数据。它正在显示数据,但问题是,它从一开始就没有在x轴上显示数据,因此所有条形图都不可见。 阵列: 条形图: 我已经尝试了stackoverflow的答案,但没有解决我的问题。请帮助! 更新: 是否可以将标签与条形图居中?

  • 我正在从csv文件中读取日期/时间和数据,并将其存储在折线图中。我的日期/时间字符串是或,这实际上是第一个条目,我有几个小时的数据。 首先,我将chartArea X轴lablestyle设置为正确的格式:。 然后,我使用与上面相同的格式将实际的日期字符串解析为DateTime格式:。并将数据添加到图表中。

  • 我是JavaFX新手,我确信我在这里遗漏了一些明显的东西。我试图制作一个汽车的动画,它从左到右穿过一扇窗户,到达那里时绕着右边。用户应该能够点击up/down来调整动画的速度。当我使用一个对象时,动画开始运行,但发现你无法调整的,所以我在一个中重新编辑了它。 然而,随着时间的推移,我被卡住了。当我启动应用程序时,汽车不会显示在屏幕上。以下是我希望的一段简洁的代码片段: 还有消旋果烷: 编辑:根据@

  • 我使用的是带有2条线的图表js折线图。我有7个x轴数据点。我只想显示第一个、第二个和最后一个数据点。但我想在工具提示中显示每个数据点。目前,我只在 x 轴标签中列出 1、2 和 7,因此工具提示在 2 上正确显示,但在其他区域当然什么都没有。那么有没有办法不在x轴上显示特定的数据点(但在代码中仍然有用于工具提示的数据)?(另外,这是一个非常简化的例子,说明我正在尝试做什么) 谢谢。

  • 我正在使用MPAndroidChart在我的android项目中绘制折线图,我看到X轴上的标签没有正确对齐,如下图所示。 未对齐标签

  • 问题内容: 我正在使用JFreeChart显示一个月的每一天的值。现在,我想让我的x轴显示一个月中的星期而不是天。目前,我的图表的值在y轴上是double,在x轴上是int。 我正在 将日期范围设置为一个月,并且 将x轴的刻度显示在正确的位置。我不想显示天(0、7、14、21、28),而是希望它们是几周(0、1、2、3、4)。 那有可能吗,我将如何做到呢? 问题答案: 您应该像时间一样使用a 作为

  • 我正在尝试使用vue-chartjs和Chart.js(2.7.1)绘制线图。显示图形,但没有xAx和yAx标签。 这是我的选项对象: 我认为scales.xAxes.scaleLabel不起作用。

  • 你好,我有一个数据框,日期作为索引,股份作为列,我想用日期作为x轴绘制一个特定的股份。我要绘制的系列是:df['APPL']=