我有3个数组x,y,c
,其中c
的每个值都是x,y
的强度,介于-3到3之间
我想将每个点绘制为一个带有由强度c
确定的颜色的实心圆。
我尝试过使用scatter(x,y,10,c)
但这基本上会导致计算机崩溃,因为数据太多了。
注意每个数组包含大约500,000个数据点。
我可以用更好的方式来策划这个吗?
答案 0 :(得分:1)
我认为您的数据集太大,无法使用您描述的方法进行绘图。如果您有500k数据点,并且每个“实心圆圈”占用5个像素,则您的数据将无法适应通常的1000x1000全屏幕图。
两个想法:
(1)如果这是你想要的行为,你必须接受你不会看到所有数据,因为有些点会阻碍其他数据。使用类似
的内容对数据集进行子采样 temp = randperm(500000); temp = temp(1:10000); scatter(x(temp),y(temp),10,c(temp));
是的,你会以这种方式丢失一些数据,但无论如何你都会失去它。这是快速目视检查的最简单方法。
(2)如果您确实想要查看所有数据,那么您应该考虑根据需要编写自定义绘图例程。以下是它的基本要点:
myImage = zeros(1000, 1000);
X_MIN = min(x);
Y_MIN = min(y);
X_RANGE = max(x) - min(x);
Y_RANGE = max(y) - min(y);
for idx = 1:500000
xIndex = round( (x(idx) - X_MIN) * 999/(X_RANGE)) + 1;
yIndex = round( (x(idx) - Y_MIN) * 999/(Y_RANGE)) + 1;
myImage(xIndex, yIndex) = myImage(xIndex, yIndex) + c(idx);
end
imshow(myImage, []);
我没有检查过,所以可能存在索引错误,但是你得到了漂移。如果您要调用它,您可能希望使用sub2ind
对此代码进行矢量化。