你如何在Matlab中制作一个类似于这个的分类散点图?
scatter
的未记录属性jitter
:% create example data
ydata = rand(50, 3)*2+2;
[r, c] = size(ydata);
xdata = repmat(1:c, r, 1);
% for explanation see
% http://undocumentedmatlab.com/blog/undocumented-scatter-plot-jitter
scatter(xdata(:), ydata(:), 'r.', 'jitter','on', 'jitterAmount', 0.05);
hold on;
plot([xdata(1,:)-0.15; xdata(1,:) + 0.15], repmat(mean(ydata, 1), 2, 1), 'k-')
ylim([0 max(ydata(:)+1)])
http://www.mathworks.com/matlabcentral/fileexchange/54243-univarscatter
您可以在普通的scatter
图上设置'XJitter'
参数,如此处所述。
'XJitterWidth'
参数可以被修改以获得更宽或更窄的点云。
例如,下面的图片是按照以下方式创建的:
% create dummy data
n = 100;
x = [ones(n,1), 2*ones(n,1), 3*ones(n,1)];
y = rand([n, 3]); % uniform distribution
% create plot
scatter(x, y, 'XJitter', 'rand', 'XJitterWidth', 0.2);
不确定这个选项是什么时候首次引入的,但它也用于swarmchart函数中,该函数在Matlab R2020b中引入:
swarmchart(x, y, 'XJitterWidth', 0.2);
根据文档,以下是抖动的实现方式:
使用加权高斯核密度估计y和每个x位置上点的相对数量的均匀随机值来抖动蜂群图中的点。当您调用swarmchart函数时,此行为对应于Scatter对象上XJitter属性的默认'density'设置。
每个x位置上点的最大扩散默认为相邻x值之间最小距离的90%:
spread = 0.9 * min(diff(unique(x)));
如果您想了解如何绘制平均值或中位数值的线,请参阅此答案。
如果您对双样本比较感兴趣,请查看gardnerAltmanPlot函数(在R2022a中引入)。这包括差异的置信区间。
subplot
……这些是真正的三个独立的图。或者,你可以缩放每个数据集的“x”值以适应定义的范围(我会选择1
),然后只需向每个数据集添加一个常量。 - Dan