使用 ginput 在 MATLAB 中绘制数字化图
Plot digitization in MATLAB using ginput
我正在尝试使用 MATLAB 将此图像数字化:
我有以下脚本:
%// 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
脚本运行良好
有什么方法可以将 x
和 y
轴更改为对数刻度?
我试过在不同的地方添加以下代码,但没有成功:
%// Set Log scale on x and y axes
set(gca,'XScale','log','YScale','log');
您可以使用
以双对数刻度绘图
loglog(x,y);
help loglog
或文档提供额外信息。
对于单个对数刻度使用
semilogx(x,y);
semilogy(x,y);
下面是一个概念证明,应该能让您走上正轨。我已经用我认为 "good practices".
替换了您原始代码中的内容
function q36470836
%% // Definitions:
FIG_NUM = 36470836;
%% // Inputs:
fname = 'http://i.stack.imgur.com/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
这是它的外观示例:
几点注意事项:
xt
、yt
可以使用 logspace
. 以更简洁的方式创建
- 很难(可能不可能)将数字化网格与图像正确对齐,这将不可避免地导致数据出错。虽然这在以下情况下会有帮助(为此您需要矢量图形编辑器,例如免费软件 InkScape):
- 如果您碰巧从 PDF 文件中获得此图像,它显示为矢量图像(您可以通过尽可能多地放大来测试这一点,而图表不会像素化;这 似乎 是你的情况
.png
看起来),你最好将它保存为矢量图像然后你有两个选择:
- 将图像导出为位图,大大提高了分辨率,然后再次尝试数字化过程。
- 将矢量图像保存为
.svg
,然后使用您喜欢的文本编辑器打开文件并获取点的精确坐标。
- 如果源图像是位图(与矢量图形相反),您可以"trace the bitmap",从而将其转换为矢量图,然后#GOTO 步骤 1。
- 此解决方案(目前)不支持调整图形大小。
Position
设置中出现的幻数是下图中解释的比例因子(size(im)
也是 [609 785 3]
)。这些可以在技术上使用 "primitive image processing" 找到,但在这种情况下,我只是明确地对它们进行硬编码。
我正在尝试使用 MATLAB 将此图像数字化:
我有以下脚本:
%// 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
脚本运行良好
有什么方法可以将 x
和 y
轴更改为对数刻度?
我试过在不同的地方添加以下代码,但没有成功:
%// Set Log scale on x and y axes
set(gca,'XScale','log','YScale','log');
您可以使用
以双对数刻度绘图loglog(x,y);
help loglog
或文档提供额外信息。
对于单个对数刻度使用
semilogx(x,y);
semilogy(x,y);
下面是一个概念证明,应该能让您走上正轨。我已经用我认为 "good practices".
替换了您原始代码中的内容function q36470836
%% // Definitions:
FIG_NUM = 36470836;
%% // Inputs:
fname = 'http://i.stack.imgur.com/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
这是它的外观示例:
几点注意事项:
xt
、yt
可以使用logspace
. 以更简洁的方式创建
- 很难(可能不可能)将数字化网格与图像正确对齐,这将不可避免地导致数据出错。虽然这在以下情况下会有帮助(为此您需要矢量图形编辑器,例如免费软件 InkScape):
- 如果您碰巧从 PDF 文件中获得此图像,它显示为矢量图像(您可以通过尽可能多地放大来测试这一点,而图表不会像素化;这 似乎 是你的情况
.png
看起来),你最好将它保存为矢量图像然后你有两个选择:- 将图像导出为位图,大大提高了分辨率,然后再次尝试数字化过程。
- 将矢量图像保存为
.svg
,然后使用您喜欢的文本编辑器打开文件并获取点的精确坐标。
- 如果源图像是位图(与矢量图形相反),您可以"trace the bitmap",从而将其转换为矢量图,然后#GOTO 步骤 1。
- 如果您碰巧从 PDF 文件中获得此图像,它显示为矢量图像(您可以通过尽可能多地放大来测试这一点,而图表不会像素化;这 似乎 是你的情况
- 此解决方案(目前)不支持调整图形大小。
Position
设置中出现的幻数是下图中解释的比例因子(size(im)
也是[609 785 3]
)。这些可以在技术上使用 "primitive image processing" 找到,但在这种情况下,我只是明确地对它们进行硬编码。