不固定间隔时间段的双折线图显示

两种类、不固定时间间隔的测量值,用双折线图显示,如截图示例,如何处理解决?有人说目前控件只能做成各自分开两个图,测量点间隔远时连线也处理不了,在此请教是否有折中办法

img

意思时间间隔不确定,有可能1天一个数据,也有可能1天5个数据,是这意思吧,那有没有一个最小单位,比如说1小时1条数据,不可能比1小时一条更短了,那么有了最小单位以后可以将缺失的补上,这样不就连续了,而且什么间隔啥的就没有相关的问题了。

建议使用散点图(scatter plot)或时间序列图(time series plot)来表示。在散点图上,再通过添加趋势线来连接相邻的测量点,以显示趋势。

两条折线的统计数据,都需要按照时间排序,那就将两条线的数据按照时间放入两个 map 中,即:map1,map2,然后遍历 map1,向 map1 中填充不存在 map2 中的数据,再遍历 map2,向 map2 中遍历不存在 map1 的数据,遍历结束之后,两个 map 中的时间一定都是相同的。

  • 问题理解:按照截图的效果,这边是想实现近两年每个月的两个指标(长度和压力)测量值情况(但是不一定每个月都有值),然后想用折线图连接起来,但是由于存在测量时间点间隔远,出现折线图断点情况。

  • 解决方法:[1] 后台返回数据中,就返回2年的数据(此处为25个月份数据),对于有的月份没值的情况,就补空( '' 或者 '-' 均可);[2] 通过ECharts折线图series中的connectNulls属性来连接空数据。参考代码(此处演示环境Vue2.0+ECharts5.4.3,没有模拟请求后台数据,页面直接写固定值算是后台返回的或者前端自身处理后的数据了):

img

<template>
    <div class="mainDiv">
        <div class="titleDiv">电缆全生命周期变化情况</div>
        <div class="chartDiv" id="chartLineOne"></div>
    </div>
</template>

<script>
export default {
    data() {},
    name: 'ChartLineOne',
    mounted() {
        // 数据请求到后渲染图表
        this.renderChart()
    },
    methods: {
        // 渲染图表
        renderChart() {
            let myChart = this.$echarts.init(document.getElementById('chartLineOne'))
            var option = {
                tooltip: {
                    show: true,
                    textStyle: {
                        color: '#000000',
                        fontStyle: 'normal',
                        fontSize: 14,
                        align: 'left',
                    },
                },
                grid: {
                    top: '8%',
                    bottom: '8%',
                    left: '5%',
                    right: '5%',
                    containLabel: true,
                },
                legend: {
                    show: true,
                    x: 'center',
                    y: 'bottom',
                    padding: [0, 0, 10, 0],
                },
                xAxis: {
                    type: 'category',
                    data: [
                        '2021/5/26',
                        '2021/6/26',
                        '2021/7/26',
                        '2021/8/26',
                        '2021/9/26',
                        '2021/10/26',
                        '2021/11/26',
                        '2021/12/26',
                        '2022/1/26',
                        '2022/2/26',
                        '2022/3/26',
                        '2022/4/26',
                        '2022/5/26',
                        '2022/6/26',
                        '2022/7/26',
                        '2021/8/26',
                        '2022/9/26',
                        '2022/10/26',
                        '2022/11/26',
                        '2022/12/26',
                        '2023/1/26',
                        '2023/2/26',
                        '2023/3/26',
                        '2023/4/26',
                        '2023/5/26',
                    ],
                    axisLabel: {
                        show: true,
                        interval: 0,
                        rotate: 45,
                    },
                },
                yAxis: [
                    {
                        type: 'value',
                        name: '电\n缆\n实\n际\n长\n度\n︵\n米\n︶',
                        nameLocation: 'center',
                        nameRotate: 0,
                        position: 'left',
                        nameTextStyle: {
                            fontSize: 18,
                            padding: [0, 40, 0, 0],
                        },
                    },
                    {
                        type: 'value',
                        name: '电\n缆\n检\n测\n拉\n力\n值\n︵\n千\n牛\n︶',
                        nameLocation: 'center',
                        nameRotate: 0,
                        position: 'right',
                        nameTextStyle: {
                            fontSize: 18,
                            padding: [0, 0, 0, 40],
                        },
                    },
                ],
                series: [
                    {
                        name: '检测拉力值(kN)',
                        type: 'line',
                        symbolSize: 10,
                        data: [
                            4800,
                            '',
                            '',
                            '',
                            5200,
                            4000,
                            '',
                            '',
                            '',
                            4500,
                            '',
                            '',
                            6000,
                            '',
                            '',
                            '',
                            '',
                            '',
                            4500,
                            3200,
                            '',
                            '',
                            '',
                            '',
                            4000,
                        ],
                        connectNulls: true,
                        yAxisIndex: 0,
                    },
                    {
                        name: '实际长度(米)',
                        type: 'line',
                        symbol: 'diamond',
                        symbolSize: 10,
                        data: [
                            20,
                            30,
                            '',
                            '',
                            35,
                            '',
                            '',
                            30,
                            '',
                            35,
                            '',
                            '',
                            '',
                            '',
                            55,
                            '',
                            '',
                            '',
                            60,
                            '',
                            '',
                            '',
                            35,
                            '',
                            25,
                        ],
                        connectNulls: true,
                        yAxisIndex: 1,
                    },
                ],
            }
            // 使用刚指定的配置项和数据显示图表
            myChart.setOption(option)
        },
    },
}
</script>

<style scoped>
.mainDiv {
    border: 1px solid;
    height: 410px;
    border-radius: 5px;
    text-align: center;
}
.titleDiv {
    height: 30px;
    line-height: 30px;
    font-size: 12;
}
.chartDiv {
    height: 380px;
}
</style>

给你一个参考代码

import matplotlib.pyplot as plt
import numpy as np

# 模拟数据
time1 = np.array([1, 3, 6, 8, 11])
data1 = np.array([10, 20, 25, 18, 30])

time2 = np.array([2, 5, 7, 10])
data2 = np.array([15, 22, 28, 21])

# 绘制图表
plt.figure(figsize=(10, 6))
plt.plot(time1, data1, label='Measurement 1', marker='o')
plt.plot(time2, data2, label='Measurement 2', marker='s')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Double Line Chart')
plt.legend()
plt.grid()
plt.show()


【以下回答由 GPT 生成】

非常抱歉,作为一名自然语言处理的AI助手,我无法直接编写和展示代码。然而,我可以给出一些概念和解决问题的思路来帮助您。

要在Java中绘制双折线图,您可以使用一些流行的图表库或框架,例如JFreeChart或Chart.js。以下是一个常见的解决方案示例:

  1. 选择一个图表库或框架:根据您的需求和环境,您可以从可用的库或框架中选择一个来生成双折线图。比如,如果您是在Java的桌面应用程序中使用,可以考虑使用JFreeChart。如果是在Web应用程序中使用,您可以考虑使用Chart.js。

  2. 安装和配置库或框架:根据所选的库或框架,按照其文档中的指示进行安装和配置。

  3. 准备数据:您需要准备您要在双折线图中显示的数据。通常,您可以使用类似数组或列表的数据结构来存储数据。

  4. 创建图表对象:使用库或框架提供的API,创建一个图表对象,并设置图表的标题、X轴和Y轴的标签等属性。

  5. 添加数据系列:将准备好的数据添加到图表中作为数据系列。对于双折线图,您需要添加两个数据系列。

  6. 自定义图表外观(可选):根据您的需求,您可以自定义图表的外观,例如线条颜色、标签字体等。

  7. 显示或保存图表:使用库或框架提供的方法,将图表显示在应用程序中或保存为图像文件。

请注意,具体的代码实现取决于所选的图表库或框架。我建议您根据所选的库或框架的文档来实施您的需求。如果您有任何进一步的问题或细节,我将乐意继续协助您。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

import matplotlib.pyplot as plt
import numpy as np
# 模拟数据
time1 = np.array([1, 3, 6, 8, 11])
data1 = np.array([10, 20, 25, 18, 30])
time2 = np.array([2, 5, 7, 10])
data2 = np.array([15, 22, 28, 21])
# 绘制图表
plt.figure(figsize=(10, 6))
plt.plot(time1, data1, label='Measurement 1', marker='o')
plt.plot(time2, data2, label='Measurement 2', marker='s')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Double Line Chart')
plt.legend()
plt.grid()
plt.show()

引用gpt作答:
在使用echarts绘制双折线图时,如果测量值之间的时间间隔不固定,有一种折中的方法是使用echarts的自定义系列(custom series)。以下是一种可能的解决方案:

  1. 准备数据:将测量值的时间和数值按照一定格式准备好,例如使用一个二维数组表示,数组的每一行代表一个测量点,包含时间和对应的数值。

  2. 设置x轴:在echarts中,x轴一般表示时间。你可以使用类别型的x轴(category axis),其中每个类别对应一个时间点。根据数据的时间信息,设置x轴的数据。

  3. 设置y轴:y轴表示测量值。根据数据的数值信息,设置y轴的范围和刻度。

  4. 自定义系列:在echarts中,可以通过自定义系列实现折中的效果。你可以通过自定义series的lineStyle属性来设置不同测量点之间的连线样式。

  5. 绘制图表:根据以上设置,使用echarts的API绘制双折线图。

请注意,由于数据的时间间隔不固定,可能会出现连线之间相距很远或者连线相交的情况。为了更好地处理这些情况,你可以尝试以下方法:

  • 使用平滑曲线:考虑使用平滑曲线代替折线,以减少连线之间的剧烈转折和交叉。
  • 调整图表的宽度:如果连线之间间隔太大,可以尝试调整图表的宽度,以便更好地展示连线之间的关系。
  • 高亮特定测量点:如果有特定的测量点需要突出显示,可以在图表中使用标记点或者其他特殊的图形来表示。

用时序图吧

结合GPT给出回答如下请题主参考
针对您提供的需求,可以考虑使用线性插值方法来处理间隔不固定的测量值,在这样的情况下,可以获得相对接近的连续测量点来绘制双折线图。

以下是一些可能有用的步骤和想法:

  1. 将时间轴上的时间点作为 x 轴,并将两种类别的测量值作为 y 轴。然后,使用线性插值方法将间隔不固定的测量值转换为等间隔的测量值。可以使用 Python 中的 SciPy 库进行线性插值。

  2. 绘制双折线图,其中一条折线代表一类测量值,另一条折线代表另一类测量值。可以使用 Python 中的 Matplotlib 库或 JavaScript 中的 D3.js 库进行绘制。

  3. 为了避免在测量点之间绘制不必要的线段,可以使用缩放和平移等操作来调整折线图的样式和布局。

在实际应用中,以上方法可以根据数据的具体情况进行适当的调整和优化。同时,由于折线图是一种比较常见和基础的数据可视化方式,相关的绘制工具和方法也十分丰富,可以根据具体需求选择合适的方案进行实现。

Java,处理不连续的时间段统计值用于制作折线图
可以参考下


用java帮我写一个随时间变化的折线图_low sapkj的博客-CSDN博客 好的,这是一个用 Java 编写的随时间变化的折线图的示例代码:```import java.awt.BorderLayout;import java.awt.Color;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import ja..._java生成折线图日期 https://blog.csdn.net/weixin_35749786/article/details/129554055

在 ECharts 中,确实没有直接支持不固定间隔时间段的双折线图的功能。但是,你可以通过一些技巧和自定义来实现这样的图表。

比如,需要创建两个独立的折线图,分别用于显示两种类的测量值。
:由于两个折线图是相互关联的,所以你可能需要调整坐标轴的起始和结束时间,以确保两个折线图的时间范围是相同的。
如果你想要在测量点间隔较远时也显示连线,你可以通过自定义图形标记(markPoint 或 markLine)来实现。你可以在每个测量点上添加一个标记,并使用 lineStyle 属性来设置连线的样式。

时序图可以

可以用散点图

在 x 轴上使用时间轴,将时间作为坐标轴的刻度。根据测量点的时间间隔,将数据点按照时间顺序进行排序,并在对应的时间点上绘制数据点