寻找一种从绘图中提取数据的工具(这里是来自协方差矩阵或马尔可夫链的二维轮廓)并重现原始图形

Looking for a tool that extracts data from a plot figure ( here 2D contours from Covariance matrix or Markov chains) and reproduce the original figure

我正在寻找能够从二维等高线图中提取数据的应用程序或工具,如下所示:

我看过 https://dash-gallery.plotly.host/Portal/ tool or https://plotly.com/dash/ , https://automeris.io/ ,但我已经测试过,这很难提取数据(实际上,这里的数据是带有椭圆的协方差矩阵,但如果可能的话,我想将其扩展到马尔可夫链).

如果有人能知道是否有更有效的工具,主要来自这种二维图。 我也对商业应用开放。我在 MacOS 11.3.

如果我不在正确的论坛上,请告诉我。

更新 1:

我尝试在 Matlab 中使用此 previous post 中的以下脚本应用该方法:

%// Import the data:
imdata = importdata('Omega_L_Omega_m.png');
Gray = rgb2gray(imdata.cdata);
colorLim = [-1 1]; %// this should be set manually
%// Get the area of the data:
f = figure('Position',get(0,'ScreenSize'));
imshow(imdata.cdata,'Parent',axes('Parent',f),'InitialMagnification','fit');
%// Get the area of the data:
title('Click with the cross on the most top left area of the *data*')
da_tp_lft = round(getPosition(impoint));
title('Click with the cross on the most bottom right area of the *data*') 
da_btm_rgt = round(getPosition(impoint));
dat_area = double(Gray(da_tp_lft(2):da_btm_rgt(2),da_tp_lft(1):da_btm_rgt(1)));
%// Get the area of the colorbar:
title('Click with the cross within the upper most color of the *colorbar*')
ca_tp_lft = round(getPosition(impoint));
title('Click with the cross within the bottom most color of the *colorbar*')
ca_btm_rgt = round(getPosition(impoint));
cmap_area = double(Gray(ca_tp_lft(2):ca_btm_rgt(2),ca_tp_lft(1):ca_btm_rgt(1)));
close(f)
%// Convert the colormap to data:
data = dat_area./max(cmap_area(:)).*range(colorLim)-abs(min(colorLim));

我似乎在 data 数组中获得了数据,但我不知道如何利用它从这些数据中重现原始图形。

谁能看到如何用我通常提取的数据用 Matlab 绘制这种图(不确定 Matlab.script 是否生成了绿色、橙色和蓝色等高线的所有数据,每个置信度水平,即也就是说,68%、95%、99.7%)?

更新 2: 我已经对以下 link 有了第一个答案要素:

partial answer but not fully completed

我引用了方法的要素:

clc
clear all;
imdata = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/642495/image.png');
close all;
Gray = rgb2gray(imdata);
yax=sum(conv2(single(Gray),[-1 -1 -1;0 0 0; 1 1 1],'valid'),2);
xax=sum(conv2(single(Gray),[-1 -1 -1;0 0 0; 1 1 1]','valid'),1);
figure(1),subplot(211),plot(xax),subplot(212),plot(yax)

ROIy = find(abs(yax)>1e5);
    ROIyinner = find(diff(ROIy)>5);
    ROIybounds = ROIy([ROIyinner ROIyinner+1]);
ROIx = find(abs(xax)>1e5);
    ROIxinner = find(diff(ROIx)>5);
    ROIxbounds = ROIx([ROIxinner ROIxinner+1]);
PLTregion = Gray(ROIybounds(1):ROIybounds(2),ROIxbounds(1):ROIxbounds(2));
PLTregion(PLTregion==255)=nan;
figure(2),imagesc(PLTregion)

[N X]=hist(single(PLTregion(:)),0:255);
figure(3),plot(X,N),set(gca,'yscale','log')

PLTitems = find(N>2000)% %limit "color" of interest to items with >1000 pixels
PLTitems = 1×10

1 67 90 101 129 132 144 167 180 194

PLTvalues = X(PLTitems);
PLTvalues(1)=[]; %ignore black?
%test out region 1
for ind = 1:numel(PLTvalues)
    temp = zeros(size(PLTregion)); 
    temp(PLTregion==PLTvalues(ind) | (PLTregion<=50 & PLTregion>10))=255; 
%     figure(100), imagesc(temp)
    temp = bwareaopen(temp,1000);
    temp = imfill(temp,'holes');
    figure(100), subplot(3,3,ind),imagesc(temp)
    figure(101), subplot(3,3,ind),imagesc(single(PLTregion).*temp,[0 255])
end

如果有人知道如何改进这些第一个有趣的结果,提一下就好了。

重述问题 - 根据不同的评论和您的更新,我的理解如下:

  • 除您之外的其他人拥有数据,这恰好是二维数据,即 Nx2 矩阵;
  • 使用协方差矩阵,他们有效地说明了这两个维度的联合分布,特别是方差;
  • 如果他们假设一个高斯分布,正如你对 1sigma、2sigma 和 3sigma 的 68%、95% 和 99.7% 的评论所暗示的那样,他们可以绘制代表二维正态分布的椭圆:这些实际上是一些与 3D“钟形”表面相关的等高线;
  • 你已经获得了图中的等高线,正在尝试获得协方差矩阵(不是原始数据...);
  • 您担心必须从每个省略号中提取信息的复杂性。

部分答案:

  • 恢复原始数据是不可能的,我希望你已经意识到这一点,但如果你还不知道,我们只需要注意协方差矩阵是数据的汇总统计量,很像平均值,并且尽管它说明了有关数据的一些信息,但许多不同的数据集可能恰好具有相同的汇总统计信息(同样的方式,许多不同的数字集可以为您提供 10 的平均值)。
  • 可以稍微恢复协方差矩阵,即矩阵 [a,b;b,c] 中的 3 个数字 a、b 和 c,但这样做的错误可能会很大,因为像素表示不精确。本质上,您将寻找两个轴的维度、方差,以及其中一个轴的角度、协方差。
  • 除非我弄错了,在上面的高斯假设下,你只需要对三个椭圆之一进行测量,然后乘以该等高线代表的任何数量的西格玛。在这里您可能想要使用定义最好的椭圆,或者尝试使用最大的椭圆,这将为您的测量提供最大的精度(参见像素化)。
  • 此外,寻找椭圆的轴和角度的问题不必像您第一次尝试时那样复杂:与其尝试寻找椭圆的轮廓,不如寻找边界矩形。
  • 为了进一步简化此过程,如果您的图像按照您显示的方式进行了颜色编码,那么在图像处理方面,蓝色像素的过滤器可能就足够了。然后简单地取最小和最大(x,y)坐标以获得边界矩形。
  • 获得边界矩形后,找到椭圆的方程(这是数学组的问题,但您可以 start here 例如)。

过滤愉快!