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 中可行吗?如果是这样,我可以使用什么包或代码来生成这些图。理想情况下,我希望该包也支持不对称错误界限。

4

5 回答 5

4

您可以通过创建以下函数在 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

x, y,epsxepsy都可以是向量。

例子:

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)

结果:

于 2013-02-22T04:33:24.643 回答
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

然后在ggplot2中使用矩形geom:

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图

基础图形

于 2013-02-21T17:41:04.500 回答
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')

在此处输入图像描述

于 2013-02-21T18:38:53.290 回答
0

这是一个 MATLAB 答案:

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')
于 2013-02-22T02:52:12.410 回答
0

ggplot2使用 . 中的包很简单R

# 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围绕x和定义的y

在此处输入图像描述

于 2013-02-21T18:43:50.540 回答