当前位置: 首页 > 面试题库 >

使用JSON数据绘制线图

贺高飞
2023-03-14
问题内容

我是Android开发的初学者,我正在上课。我的职责是将应用程序中的JSON数据显示为文本和图形。我正在使用Retrofit
2在一个活动中将其显示为文本,但是我在使用图形时遇到了问题,我不知道该怎么做(我仍在学习,到目前为止我所做的一切都是在帮助下来自教程)。

数据如下所示(这是一个示例):

{
"id": 1,
"measurements": [{
    "time": "18:25:43",
    "value": 25.4
},
{
    "time": "18:35:43",
    "value": 27.3
},
{
    "time": "18:45:21",
    "value": 26.3
},
{
    "time": "18:55:43",
    "value": 25.2
},
{
    "time": "19:05:43",
    "value": 25.2
},
{
    "time": "19:15:43",
    "value": 25.2
},
{
    "time": "19:25:43",
    "value": 24.9
}]
}

我已经找到了,但是我不确定下一步该怎么做。我应该用数据制作两个数组列表(如果答案是,怎么做?),或者有更好的解决方案,直接使用时间和值,并以时间为X轴和值作为Y轴绘制图。


问题答案:

这是您的解决方案。

首先,您必须添加依赖项

dependencies{
  compile 'com.github.PhilJay:MPAndroidChart:v2.2.3'
  ....}

现在在您的xml中添加以下代码

<com.github.mikephil.charting.charts.LineChart
                android:id="@+id/chart1"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

现在在您的Java代码中

ArrayList<Entry> x;
ArrayList<String> y;
private LineChart mChart;
public String TAG = "YOUR CLASS NAME";

内部onCreate方法

    x = new ArrayList<Entry>();
    y = new ArrayList<String>();
    mChart = (LineChart) view.findViewById(R.id.chart1);
    mChart.setDrawGridBackground(false);
    mChart.setDescription("");
    mChart.setTouchEnabled(true);
    mChart.setDragEnabled(true);
    mChart.setScaleEnabled(true);
    mChart.setPinchZoom(true);
    mChart.setMarkerView(mv);
    XAxis xl = mChart.getXAxis();
    xl.setAvoidFirstLastClipping(true);
    YAxis leftAxis = mChart.getAxisLeft();
    leftAxis.setInverted(true);
    YAxis rightAxis = mChart.getAxisRight();
    rightAxis.setEnabled(false);
    Legend l = mChart.getLegend();
    l.setForm(Legend.LegendForm.LINE);

单击按钮时调用此方法。

private void drawChart() {

    String tag_string_req = "req_chart";

    StringRequest strReq = new StringRequest(Request.Method.POST, "YOUR URL",
            new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {

                    Log.d(TAG, "Response: " + response);

                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        String id = jsonObject.getString("id");
                        JSONArray jsonArray = jsonObject.getJSONArray("measurements");
                        for (int i = 0; i < jsonArray.length(); i++) {

                            int value = jsonObject.getInt("value");
                            String date = jsonObject.getString("time");
                            x.add(new Entry(value, i));
                            y.add(date);

                        }
                        LineDataSet set1 = new LineDataSet(x, "NAV Data Value");
                        set1.setLineWidth(1.5f);
                        set1.setCircleRadius(4f);
                        LineData data = new LineData(y, set1);
                        mChart.setData(data);
                        mChart.invalidate();

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Error: " + error.getMessage());
        }
    });
    strReq.setRetryPolicy(new RetryPolicy() {

        @Override
        public void retry(VolleyError arg0) throws VolleyError {
        }

        @Override
        public int getCurrentTimeout() {
            return 0;
        }

        @Override
        public int getCurrentRetryCount() {
            return 0;
        }
    });
    strReq.setShouldCache(false);
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}

如此处的AppController代码

public class AppController extends Application {
public static final String TAG = AppController.class.getSimpleName();
private RequestQueue mRequestQueue;
private static AppController mInstance;
@Override
public void onCreate() {
    super.onCreate();
    mInstance = this;
}

  public static synchronized AppController getInstance() {
    return mInstance;
}

public RequestQueue getRequestQueue() {
    if (mRequestQueue == null) {
        mRequestQueue = Volley.newRequestQueue(getApplicationContext());
    }
    return mRequestQueue;
}

public <T> void addToRequestQueue(Request<T> req, String tag) {
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
    getRequestQueue().add(req);
}
 }

希望这会帮助你。如果有任何问题,请通知我。



 类似资料:
  • 本文向大家介绍Python使用plt.boxplot() 参数绘制箱线图,包括了Python使用plt.boxplot() 参数绘制箱线图的使用技巧和注意事项,需要的朋友参考一下 Python 绘制箱线图主要用 matplotlib 库里 pyplot 模块里的 boxplot() 函数。 plt.boxplot() 参数详解 1、示例1 代码 图形 2、 示例 2 代码 图形 以上就是本文的全部

  • 问题内容: 我有一个sqlite数据库,其中包含以下格式的基本天气信息: 我如何使用绘制这些数据?在能够绘制数据之前,我必须重新整理数据吗? 问题答案: 要从sqlite数据库中提取数据,您可以使用命令行工具即时提取数据。使用gnuplot可以做到这一点,方法是使用a 生成外壳并使用给定的shell命令的输出进行绘图。 这将为每个图提取所有四个字段(重复先前的文件名/ shell命令)。您还可以使

  • 问题内容: 我已经使用样条插值法来平滑时间序列,并且还想在绘图中添加一条水平线。但是似乎有一个我无法控制的问题。任何帮助都会非常有帮助。这是我所拥有的: 问题似乎与我对水平线图的使用有关。 问题答案: 您是正确的,我认为这使您失望。您将要重用原始的x轴变量,并使用另一个包含变量的相同长度的numpy数组对其进行绘制。 希望可以解决问题!

  • 我使用样条插值来平滑时间序列,还想在图中添加一条水平线。但是似乎有一个问题超出了我的控制范围。任何帮助都会很有帮助。这是我所拥有的: 问题似乎在于我使用进行水平线绘制。

  • 我用JFreeChart来表示我的x和y数组。这些数组被绘制得很好,但是回归线被破坏了,永远也不会被绘制出来。除了和函数之外,所有函数都可以工作,例如打印值。不知怎的,这两个都不起作用。我不太介意,但我喜欢能够。我的阵列具有正确的数据,因此不确定问题出在哪里。我正在函数中将数组数据导入数据集。我的具有和阵列。它们有和数据类型。

  • 问题内容: 我有一个pandas-Dataframe并用于计算均值(例如每日或每月均值)。这是一个小例子。 我现在该如何绘制monthly_mean?如何管理将新创建的DataFrame的索引用作x轴?提前致谢。 问题答案: 您可以用来将索引变回一列: