如何在R或MATLAB中为散点图创建着色错误栏“框”

时间:2013-02-21 17:34:50

标签: r matlab plot

我想在R或MATLAB中创建一个简单的散点图,其中包含两个与$ x $和$ y $相关的变量,$ \ epsilon_x $和$ \ epsilon_y $。

不是添加错误条,而是希望在每个$(x,y)$对周围创建一个“阴影框”,其中框的高度范围从($ y - \ epsilon_y $)到( $ y + \ epsilon_y $)并且框的宽度范围从($ x - \ epsilon_y $)到($ x + \ epsilon_y $)。

这在R或MATLAB中是否可行?如果是这样,我可以使用什么包或代码来生成这些图。理想情况下,我希望该软件包还支持非对称错误边界。

5 个答案:

答案 0 :(得分: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

xyepsxepsy都可以是矢量。

示例:

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)

结果:

答案 1 :(得分: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 graph

Base graphics

答案 2 :(得分: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

答案 3 :(得分: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 xy定义。

enter image description here

答案 4 :(得分: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')