如何通过图片提取文献图里的数据点

本文介绍了如何将图片导入系统,通过标定过程确定位置并标记数字。用户可以选择对数坐标,查看和新增数据点,如原始数据点(0.1,1.14977),操作简便且精度较高。

链接

将图片导入链接中

然后进行标定

在这里插入图片描述
标定是按照X1,X2,Y1,Y2的顺序来的,完成之后点击complete!

给所标定的位置标识数字

在这里插入图片描述
可以勾选对数坐标,完成之后点击OK

查看点数据

在这里插入图片描述
点击图片中你想知道的点,选中后会显示红色圆点,然后点击左侧的view data。
即可显示具体坐标,这里我们查看原始的数据点为(0.1,1.14977)精度还可以。

新增数据点

在这里插入图片描述
点击右侧的Add Point可以新增数据点。

### 方法2的集成与实时电压监测图表显示正确数据 为了确保方法2能够正确集成到现有MATLAB代码中,并解决实时电压监测图表中没有数据的问题,需要对程序进行以下调整和扩展。 #### 1. 数据解析与验证 在主循环中,当接收到串口数据时,必须确保数据解析的准确性。如果解析失败或数据格式不符合预期,则可能导致图表无法显示数据。因此,增加数据验证步骤以确保解析后的电压值有效[^1]。 ```matlab if startsWith(data, "VOLT:") try voltages = str2double(split(extractAfter(data,"VOLT:"), ","))'; if all(~isnan(voltages)) && numel(voltages) == 4 % 数据有效,继续处理 else disp(['! 数据无效: ', data]); continue; end catch disp(['! 数据异常: ', data]); continue; end end ``` #### 2. 滤波器设计与初始化 在程序开始部分定义并初始化低通滤波器,确保其参数在整个程序中可用。这里使用巴特沃斯滤波器来平滑电压数据[^2]。 ```matlab % 设计低通滤波器 fs = 100; % 假设采样频率为100Hz fc = 5; % 截止频率为5Hz [b, a] = butter(2, fc / (fs / 2), 'low'); % 设计滤波器 % 初始化滤波器状态变量 zf = zeros(max(length(a)-1, length(b)-1), 4); ``` #### 3. 数据平滑处理 在接收到新的电压数据后,应用低通滤波器对其进行平滑处理。这一步骤确保最终存储到缓冲区中的电压值是经过滤波的,从而减少噪声影响[^2]。 ```matlab % 应用低通滤波器对电压数据进行平滑处理 [smoothedVoltages, zf] = filter(b, a, voltages', [], zf); % 存储平滑后的电压值 voltageBuffer(idx,:) = smoothedVoltages'; ``` #### 4. 曲线更新逻辑 在更新曲线时,确保仅使用有效的数据点。通过检查时间缓冲区和电压缓冲区中的非NaN值,避免将无效数据添加到曲线中[^1]。 ```matlab % 更新所有曲线 for ch = 1:4 clearpoints(h(ch)); % 清除当前曲线的所有点 validIdx = ~isnan(timeBuffer); % 找出有效的时间索引 addpoints(h(ch), timeBuffer(validIdx), voltageBuffer(validIdx,ch)); % 添加新点 end ``` #### 5. 动态X轴调整 动态调整X轴范围以确保图表始终显示最新的电压数据。此操作通过计算当前时间缓冲区的最大值和最小值来实现[^1]。 ```matlab % 动态调整X轴 ax.XLim = [max(0, timeBuffer(idx)-10), max(10, timeBuffer(idx))]; drawnow limitrate; ``` #### 6. 完整代码示例 以下是整合后的完整代码示例: ```matlab function realTimeVoltagePlot() % 清理环境 close all force; delete(instrfindall); try % 串口初始化 ports = serialportlist("available"); if isempty(ports) error('无可用串口'); end s = serialport(ports(1), 9600); configureTerminator(s, "LF"); disp(['已连接: ', ports(1)]); % 图形初始化 fig = figure('Name','多通道电压监测','NumberTitle','off'); ax = axes('Parent',fig); colors = lines(4); % 4条不同颜色的曲线 h = gobjects(1,4); for i = 1:4 h(i) = animatedline(ax, 'Color', colors(i,:), 'DisplayName',['A',num2str(i-1)]); end legend('Location','northeast'); grid on; ylim([0 5]); xlabel('时间 (秒)'); ylabel('电压 (V)'); title('实时电压监测'); % 设计低通滤波器 fs = 100; % 假设采样频率为100Hz fc = 5; % 截止频率为5Hz [b, a] = butter(2, fc / (fs / 2), 'low'); % 设计滤波器 % 初始化滤波器状态变量 zf = zeros(max(length(a)-1, length(b)-1), 4); % 数据记录 startTime = tic; maxPoints = 500; timeBuffer = nan(maxPoints,1); voltageBuffer = nan(maxPoints,4); dataCount = 0; % 主循环 while ishandle(fig) if s.NumBytesAvailable > 0 data = readline(s); % 数据解析 if startsWith(data, "VOLT:") try voltages = str2double(split(extractAfter(data,"VOLT:"), ","))'; if all(~isnan(voltages)) && numel(voltages) == 4 % 应用低通滤波器对电压数据进行平滑处理 [smoothedVoltages, zf] = filter(b, a, voltages', [], zf); % 记录数据 dataCount = dataCount + 1; idx = mod(dataCount-1, maxPoints) + 1; timeBuffer(idx) = toc(startTime); voltageBuffer(idx,:) = smoothedVoltages'; % 更新所有曲线 for ch = 1:4 clearpoints(h(ch)); validIdx = ~isnan(timeBuffer); addpoints(h(ch), timeBuffer(validIdx), voltageBuffer(validIdx,ch)); end % 动态调整X轴 ax.XLim = [max(0, timeBuffer(idx)-10), max(10, timeBuffer(idx))]; drawnow limitrate; else disp(['! 数据无效: ', data]); end catch disp(['! 数据异常: ', data]); end end end pause(0.01); end catch ME errordlg(['错误: ', ME.message]); end % 清理 if exist('s','var'), delete(s); end end ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值