titulo - matlab: gráficos de dispersión con un alto número de puntos de datos
plot matlab (4)
Mi experiencia es que el comando de trazado más eficiente en matlab es Patch, y lo he usado para emular la funcionalidad de scatter o scatter3 con una eficiencia mucho mayor.
Si tiene una lista de puntos, use cada punto para definir un parche cuadrado (u octágonos, o lo que sea) de una longitud de borde razonable para sus datos particulares, luego trace la colección de parches con una sola llamada al parche. Después de crear el objeto gráfico, puede actualizar sus datos de color para colorear individualmente los cuadrados.
Puede usar el mismo concepto en 3D construyendo cubos o cruces en 3D a partir de su conjunto de datos.
Este fragmento crea 1e5 cuadrados colocados al azar, con colores al azar en este caso y se ejecuta en poco menos de un segundo en mi computadora portátil de cuatro años. Una llamada similar a dispersarse toma 40 segundos y devuelve una figura difícil de manejar que es difícil de manipular.
tic
P=rand(1e5,2);
Edge=.01;
X=[P(:,1)''; P(:,1)''+Edge; P(:,1)''+Edge; P(:,1)''];
Y=[P(:,2)''; P(:,2)''; P(:,2)''+Edge; P(:,2)''+Edge];
figure;
h=patch(X,Y,''r'');
set(h,''facevertexcdata'',rand(size(X,2),3),''facecolor'',''flat'',''edgecolor'',''none'')
drawnow
toc
Estoy tratando de trazar la dispersión, algo como:
scatter(coor(:, 2), coor(:, 3), 1, coor(:, 4));
El problema es que tengo un gran número de coordenadas para trazar (~ 100 000). Lleva mucho tiempo trazarlo, y cuando intento exportar la cifra a tiff, entonces matlab está muerto por unos minutos ... ¿Alguna solución para mejorar el trazado, o al menos la exportación tiff?
EDITAR: Olvidó mencionar, la tercera coordenada (coor (:, 4)) es un código de color.
Entonces, cuando uso scatter (como se muestra arriba), tengo algo como en la imagen de abajo, y así es exactamente como quiero verlo (solo que es muy lento y no puedo exportarlo):
Cuando lo hago:
plot3 (coor (:, 2), coor (:, 3), coor (:, 4), ''.'')
el efecto ya no es tan genial (nota: las imágenes no son de las mismas coordenadas ...):
Puedes usar la plot , pero entonces todos los puntos tienen el mismo color. Sin embargo, puede dividir el conjunto en diferentes subconjuntos y trazarlos con su propio color:
N = 100000;
x = rand(N,1);
y = rand(N,1);
C = sin(2*x)+y;
cdivs = 10;
[~, edges] = hist(C,cdivs-1);
edges = [-Inf edges Inf]; % to include all points
[Nk, bink] = histc(C,edges);
figure;
hold on;
cmap = jet(cdivs);
for ii=1:cdivs
idx = bink==ii;
plot(x(idx),y(idx),''.'',''MarkerSize'',4,''Color'',cmap(ii,:));
end
colormap(cmap)
caxis([min(C) max(C)])
colorbar
que ya responde mucho mejor que la scatter(x,y,1,C)
que da aproximadamente la misma trama, pero con una resolución de color más alta (que se puede ajustar en mi código anterior).
Si tiene demasiados puntos, podría tener sentido reducir los datos.
Básicamente se podrían hacer dos enfoques:
simple - simplemente seleccione - diga el 10% de los puntos al azar.
descarte los puntos que no serían visibles, obviamente aquellos que se encuentran fuera de su rango, pero también si tiene demasiadas superposiciones, digamos que un punto debe tener un diámetro de 3px, por lo que un punto cubrirá 9px. En mi máquina, una gráfica como la que usted publicó sería: digamos 400x400px, por lo tanto, como máximo
ceil(400*400/9) < 20 000
400/9ceil(400*400/9) < 20 000
puntos de datos serían visibles.
También puede tratar de separar la trama en trozos más pequeños, como trazar 1000 puntos, emitir un drawnow
luego los siguientes 1000 hasta que haya terminado. Así que no tienes que esperar delante de una pantalla en blanco.
Si usa plot3
plot3(coor(:, 2), coor(:, 3), coor(:, 4), ''.'')
Esto hará lo mismo que un diagrama de dispersión 3d (los puntos serán puntos pequeños, también puede usar ''o'' or ''x''
si lo desea)