matlabimage-processingplotaxesginput

Plot digitization in MATLAB using ginput


I'm trying to digitize this image using MATLAB:

log scale plot

I have the following script:

%// Get data from plot
clear all; close all;
%// Input
fname = 'Fig15a.PNG'; 
 xvec = [1e3:1:1e8]; 
 yvec = [1e-4:1:1e-1]; 
   xt = [1e3 1e4 1e5 1e6 1e7 1e8]; 
   yt = [1e-4 1e-3 1e-2 1e-1];

%// Read and plot the image
im = imread(fname);
figure(1), clf
im = im(end:-1:1,:,:);
image(xvec,yvec,im)
axis xy; 
grid on;

%// Set ticks
set(gca,'xtick',xt,'ytick',yt); %// Match tick marks

%// Collect data
[x,y] = ginput; %// Click on points, and then hit ENTER to finish

%// Plot collected data
hold on; plot(x,y,'r-o'); hold off;

%// Then save data as:
save Fig15a.mat x y

The script works fine Line scale output

Is there a way I can change the x and y axes to a log scale ? I have tried adding the following code in different places without luck:

%// Set Log scale on x and y axes
set(gca,'XScale','log','YScale','log');

Solution

  • Below's a proof of concept that should get you on the right track. I have replaced things in your original code with what I consider "good practices".

    function q36470836
    %% // Definitions:
    FIG_NUM = 36470836;
    %% // Inputs:
    fname = 'https://i.sstatic.net/2as4t.png'; 
    xt = logspace(3,8,6);
    yt = logspace(-4,-1,4);
    %% // Init
    figure(FIG_NUM); clf
    % Read and plot the image
    im = imread(fname);
    hIMG = imshow(im); axis image;
    
    %// Set ticks
    hDigitizer = axes('Color','none',...
                      'XLim',[xt(1) xt(end)],'YLim',[yt(1) yt(end)],...
                      'XScale','log','YScale','log',...
                      'Position',hIMG.Parent.Position .* [1 1 696/785 (609-64+1)/609]);
    
    uistack(hDigitizer,'top'); %// May be required in some cases
    grid on; hold on; grid minor;
    
    %// Collect data:
    [x,y] = ginput; %// Click on points, and then hit ENTER to finish
    
    %// Plot collected data:
    scatter(x,y,'o','MarkerEdgeColor','r');
    
    %// Save data:
    save Fig15a.mat x y
    

    Here's an example of what it looks like:

    Output

    Few notes: