2013-02-21 51 views
2

我想在R或MATLAB中創建一個簡單的散點圖,其中包含兩個變量$ x $和$ y $,這兩個變量具有與它們相關的錯誤, $ \ epsilon_x $和$ \ epsilon_y $。然而,我並沒有添加錯誤條,而是希望在每個$(x,y)$對周圍創建一個「陰影框」,其中框的高度範圍從($ y - \ epsilon_y $)到($ y + \ epsilon_y $),框的寬度範圍從($ x - \ epsilon_y $)到($ x + \ epsilon_y $)。如何在R或MATLAB中爲散點圖創建陰影誤差欄「框」

這是可能的R或MATLAB?如果是這樣,我可以使用什麼包或代碼來生成這些圖。理想情況下,我希望包也支持不對稱誤差界限。

回答

4

你可以通過創建以下功能做在MATLAB向量。

例子:

x = randn(1,5); y = randn(1,5); 
epsx = rand(1,5)/5; 
epsy = rand(1,5)/5; 

plot(x,y,'rx') 
hold on 
errorBox(x,y,epsx,epsy) 

結果:

+0

是什麼讓你取消接受這個答案嗎?你不喜歡什麼,也許我可以改進它? – ThijsW 2013-02-26 03:51:25

1

使用ggplot2可能更容易。首先創建了一些數據:

set.seed(1) 
dd = data.frame(x = 1:5, eps_x = rnorm(5, 0, 0.1), y = rnorm(5), eps_y = rnorm(5, 0, 0.1)) 

##Save space later  
dd$xmin = dd$x - dd$eps_x 
dd$xmax = dd$x + dd$eps_x 
dd$ymin = dd$y - dd$eps_y 
dd$ymax = dd$y + dd$eps_y 

然後用矩形GEOM在GGPLOT2:

library(ggplot2) 
ggplot(dd) + 
    geom_rect(aes(xmax = xmax, xmin=xmin, ymin=ymin, ymax = ymax)) 

給人的第一情節。當然,你並不需要使用GGPLOT2,以獲得在基地的圖形類似的東西,嘗試:

plot(0, 0, xlim=c(0.5, 5.5), ylim=c(-1, 1), type="n") 
for(i in 1:nrow(dd)){ 
    d = dd[i,] 
    polygon(c(d$xmin, d$xmax, d$xmax, d$xmin), c(d$ymin, d$ymin, d$ymax,d$ymax), col="grey80") 
} 

獲得第二個情節。

ggplot2 graph

Base graphics

1

下面介紹如何利用Matlab(非對稱間隔)來做到這一點。轉換爲對稱應該是微不足道的。

%# define some random data 
x = rand(5,1)*10;y = rand(5,1)*10; 
%# ex, ey have two columns for lower/upper bounds 
ex = abs(randn(5,2))*0.3;ey=abs(randn(5,2)); 

%# create vertices, faces, for patches 
vertx = bsxfun(@minus,y,ey(:,[1 2 2 1]))'; 
verty = bsxfun(@minus,y,ey(:,[1 1 2 2]))'; 
vertices = [vertx(:),verty(:)]; 
faces = bsxfun(@plus,[1 2 3 4],(0:4:(length(x)-1)*4)'); 

%# create patch 
patch(struct('faces',faces,'vertices',vertices),'FaceColor',[0.5 0.5 0.5]); 

%# add "centers" - note, the intervals are asymmetric 
hold on, plot(x,y,'oy','MarkerFaceColor','r') 

enter image description here

0

這與ggplot2R簡單。

# An example data frame 
dat <- data.frame(x = 1:5, y = 5:1, ex = (1:5)/10, ey = (5:1)/10) 

# Plot 
library(ggplot2) 
ggplot(dat) + 
    geom_rect(aes(xmin = x - ex, xmax = x + ex, ymin = y - ey, ymax = y + ey), 
      fill = "grey") + 
    geom_point(aes(x = x, y = y)) 

aes函數內部geom_rect的矩形的尺寸是由exey周圍xy定義。

enter image description here

0

這裏有一個MATLAB的答案:

function errorBox(x,y,epsx,epsy) 
    %# make sure inputs are all column vectors 
    x = x(:); y = y(:); epsx = epsx(:); epsy = epsy(:); 

    %# define the corner points of the error boxes 
    errBoxX = [x-epsx, x-epsx, x+epsx, x+epsx]; 
    errBoxY = [y-epsy, y+epsy, y+epsy, y-epsy]; 

    %# plot the transparant errorboxes 
    fill(errBoxX',errBoxY','b','FaceAlpha',0.3,'EdgeAlpha',0) 
end 

xyepsxepsy都可以:

x = randn(1,5); y = 3-2*x + randn(1,5); 
ex = (.1+rand(1,5))/5; ey = (.2+rand(1,5))/3; 
plot(x,y,'ro') 
patch([x-ex;x+ex;x+ex;x-ex],[y-ey;y-ey;y+ey;y+ey],[.9 .9 .9],'facealpha',.2,'linestyle','none')