【问题标题】:MPAndroidChart gradient line depending on dataset valuesMPAndroidChart 渐变线取决于数据集值
【发布时间】:2021-03-19 14:11:20
【问题描述】:

我目前正在使用MPAndroidChart 开展一个项目,我想制作一个 LineChart 来表示每小时的数据。我需要此图表根据 yAxis 上的值具有渐变线。

例如。在上图中,我希望线条在 yAxis 值大于 50 时改变颜色。 我没有找到任何解决我的问题的方法,所以欢迎任何建议或示例

【问题讨论】:

  • 您想要检查最后一个可用值还是所有值?
  • @UmerFarooq 我希望它出现在图表上的每个值上。例如,从 02:00 到 03:00 线应该从绿色变为红色,然后从 03:00 到 04:00 和 04:00 到 05:00 保持相同的颜色(因为两个值都高于 50),然后从 05:00 到 06:00 再次变为绿色,等等。
  • @yakamuki 您是否创建了以下图。如果您有任何感谢,请添加解决方案
  • @RavindraKushwaha 我找不到使线条渐变的解决方案,但我做了类似于here 所述的操作

标签: android gradient mpandroidchart linechart


【解决方案1】:

我最近不得不面对完全相同的问题,解决方案是定义一个线性渐变并将其应用为着色器,如下所示:

(警告:您会注意到代码看起来很有趣,那是因为它是 xamarin 代码(即:C#,不是 java 或 kotlin),但您可以轻松翻译它,主要是您必须为 camelCase 更改 PascalCase,并将一些属性更改为 setter 和 getter,反之亦然,只需使用 IDE 的智能感知)

[set your line chart, add the dataset, etc]
...
var gradient = new LinearGradient(0f, 0f, 0f, 100f, 
               [your first color], [your second color], 
               Shader.TileMode.Clamp);
var paint = vh.Chart.Renderer.PaintRender;
paint.SetShader(gradient);
...
[set axis, labels, grid, etc]
...
lineChart.Invalidate(); //this is to refresh the chart on the screen, you may need it or not depending on your code

在上面的代码中,您只需添加颜色,并且您可能希望通过在创建线性渐变时更改 4 个第一个浮点数来更改渐变方向(我在这里使用垂直渐变)。例如,一个典型的更改是设置 y0 = 0 和 y1 = 图表的高度。您必须根据您的布局使用这些值。

这段代码的结果是这样的:

当然,我用重复的样本数据集来展示它,这就是为什么你会看到两张卡在同一行。

更新: 我了解您想要实现的目标,并且使用上面的代码您可以做到。当然,您需要进行一些计算,但您可以设置“触发器”,使颜色在您想要的任何 Y 坐标处开始变化。

例如,在第一张图片中,我使用了坐标 0,0,0,100 (请记住,我向您展示了 dp 中的最后一个值,但在实际代码中,我将根据设备的分辨率将其转换为等效的像素。它大约是我图表的高度)

在下图中,我已将其更改为 0,0,0,50:

如您所见,您只需更改 4 个值即可完全控制渐变的显示方式。 (或者,就我而言,只是其中之一) (您可能注意到我已经按照我的设计更改了颜色,它与阈值无关)

【讨论】:

  • 这似乎是正确的,但在我的情况下,我必须表示一些医疗数据(压力、人力资源等),并且我对每个非静态值都有一个阈值。每个数据的阈值可以随时更改,因此线条必须根据当前阈值调整颜色变化。那是我的问题,如何在 linearGradient 中定义颜色变化开始的限制
【解决方案2】:

假设您正在使用 for 循环来填充数据。在列表中,您需要为每个值填充颜色列表,然后使用lineDataSet.setColors(listOfColors)

List<Integer> listOfColors = new List<>();
for(i= 0; i<dataEntries.size(); i++){
    //Logic for colors
    if(i<= dataEntries.size()-1){ //Otherwise app will crash on last index
        if(dataEntries.get(i+1).y > 50)
            listOfColors.add(Color.GREEN);
        else
            listOfColors.add(Color.RED);
}

然后在最后

lineDataSet.setColors(listOfColors)

希望对你有所帮助。

【讨论】:

  • 到目前为止一切顺利。但我希望线条颜色是渐变的,并且我只想在 yAxis 上超过 50 时更改线条的颜色。例如。如果我在 y=20 中有一个点并且下一个点在 y=80,那么使用您的代码示例,从 20 到 80 的线将被涂成红色。理想情况下,我希望线保持绿色,直到它通过 yAxis 上的 50 阈值,然后变为渐变红色,直到 y=80
  • 这在 MPChart 中是不可能的。为此,您需要创建自定义图表
  • 我找到了一个sn-p的代码,它使线条渐变 Paint paint = chart.getRenderer().getPaintRender();整数高度 = 100; LinearGradient linGrad = new LinearGradient(0, 0, 0, height, ContextCompat.getColor((MainActivity)mContext, R.color.stressNormal), ContextCompat.getColor((MainActivity)mContext, R.color.stressHigh), Shader.TileMode。夹钳); paint.setShader(linGrad);但我不知道是否有办法修改它,以便在值 50 之后更改颜色。
  • @UmerFarooq 你能否添加整个代码来完成上述任务。请帮我解决一下,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2012-06-28
  • 2018-09-30
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多