如何在matlab或R中的散点图上叠加框图?

时间:2014-09-24 02:48:57

标签: r matlab scatter-plot boxplot

如何在Matlab或R中的链接1中显示图?我在google和stackoverflow中搜索过,但是找不到我需要的内容。

enter image description here

我需要的是在Matlab或R中的散点图上叠加框图来显示数据分布,还是有其他方法或软件来实现我需要的东西?

这是我第一次在stackoverflow中提问,我的英语非常普遍,也许我做了一些不合适的事情。所以,请原谅我并帮助我。 O(∩_∩)O〜

How can I overlay box plot on scatter plot in matlab or R?

2 个答案:

答案 0 :(得分:2)

在R中,你可以做像Maybe这样的事情

#sample data
dd<-data.frame(x=runif(100))
br=seq(0,1,length.out=6)
cent<-(br[-1] +br[-length(br)])/2
dd<-transform(dd, y = x+rnorm(100, .2, .05),
   xcut = cut(x, breaks=br))

#plot
plot(y~x, dd)
boxplot(y~xcut, dd, add=T, at=cent, boxwex=(br[2]-br[1]) * 3/4, xaxt="n")

产生

enter image description here

诀窍就是沿着x轴使用cut()将范围分解为您想要绘制箱形图的离散块。然后你就可以在顶部绘图并排列。

答案 1 :(得分:0)

这是我的Matlab代码,以实现我的需要,但我仍然不满意。

function handle = scatterbox(x,y,n,varargin)
% handle = sactter_box(x,y,n[,'pointsize',size,'pointcolor',color,'pointmarker',marker])
% x——x;
% y——y;
% n——the number of boxes;
% pointsize——point size(default value is 100);
% pointcolor——point color(default value is [hex2dec('ad')/256 hex2dec('ad')/256 hex2dec('ad')/256]);
% pointmarker——point marker(default value is '.');

%% 检查参数输入个数,并读取可选参数
if nargin<3
error('至少包含x、y和n等3个必要参数!');
elseif nargin>3 && nargin<9 && mod(nargin,2)==0
error('参数输入应为3、5、7或9个!')
elseif nargin>9
error('参数输入超过最大9个!')
else
%设置可选参数默认值
pointsize    = 36;
pointcolor   = [hex2dec('ad')/256 hex2dec('ad')/256 hex2dec('ad')/256];
pointmarker  = '.';

%读取可选参数
Arguments = varargin;
while length(Arguments)>=2 %设置循环条件
Property = Arguments{1}; %获取参数名称
Value = Arguments{2}; %获取参数值
Arguments = Arguments(3:end); %循环设置,取剩余参数
switch Property %判断可选参数
case 'pointsize'
if isa(Value,'numeric')
pointsize = Value;
else
error('size参数应为数字!')
end
case 'pointcolor'
if find(strcmp({'y' 'm' 'c' 'r' 'g' 'b' 'w' 'k'},Value))    %用字母表示颜色
pointcolor = Value;
elseif isa(Value,'numeric') && sum(size(Value)==[1 3])==2   %用二维矩阵表示颜色
pointcolor = Value;
else
error('color参数应为颜色格式!')
end
case 'pointmarker'
if find(strcmp({'o' '+' '*' '.' 'x' 's' 'd' '^' 'v' '>' '<' 'p' 'h' 'none'},Value))
pointmarker = Value;
else
error('marker参数应为符号字符!')
end
otherwise
error('参数名输入出错!');
end
end
end

%% scatterbox
handle = scatter(x,y,pointsize,pointcolor,pointmarker);    %作散点图

limits = axis(gca); %获取坐标范围
box_datarange = (limits(2)-limits(1))/n;    %获取箱线图对应数据范围
box_position = limits(1)-box_datarange/2+box_datarange*[1:n];   %获取箱线图x轴位置

hold on;
for i=1:n    %通过循环作箱线图
box_data = y(x>=box_position(i)-box_datarange/2 & x<box_position(i)+box_datarange/2);   %获取箱线图数据
if length(box_data)>3   %仅当数据量大于3时作箱线图
boxplot(box_data,...
'positions',box_position(i),... %设置箱线图位置
'plotstyle','compact',...   %设置箱线图样式
'colors',[0 hex2dec('91')/256 0],...    %设置箱线图颜色
'symbol','');    %设置异常值散点符号为空,即不显示异常值
set(gca,'XTickLabel',{''}); %清除x轴箱线图产生标注
end
end

axis(gca,limits);   %恢复原坐标范围
set(gca,'XTickLabelMode','auto','XTickMode','auto');    %恢复默认刻度和标注

end