Quiero trazar un diagrama de dispersión con el lleno de los marcadores y hacer de ellos semi-transparente, así que cuando dos o más marcadores de superposición, el área de superposición será más opaco.

Pensé ingenuamente

sg = scatter(rand(1000,1),rand(1000,1), 'filled');
alpha(0.5)

iba a funcionar, pero no es así. También

set(get(sg, 'Children'), 'FaceAlpha', 0.2)

no funciona. Alguna idea?

posibles duplicados de Parcela círculos con valores alfa en matlab
Tal vez no había una forma sencilla de hacer que por el momento esta pregunta se la hicieron, pero ahora hay una manera. No estoy seguro, ya que la versión que aunque. Ver este enlace..

OriginalEl autor Ruggiero Spearman | 2011-06-16

6 Comentarios

  1. 5

    AFAIK, usted no puede cambiar los valores alfa de la trama marcadores en scatter. Una solución sería patch para dibujar los marcadores de sí mismo. Alfa se pueden establecer valores para patch() objetos y obtendrá el efecto deseado cuando los marcadores de superposición. Sin embargo, esto puede llegar a ser muy engorroso y tendrá que ser personalizado a sus necesidades.

    Ver esta pregunta relacionada con la, donde la función definida en la pregunta que hace exactamente eso. Usted puede usar esto como un punto de partida y trabajar desde allí.

    Bueno, eso es lo que he imaginado y temido. Aún así, me voy a dejar la pregunta abierta por un tiempo sólo para asegurarse de que nadie con una respuesta que está dando vueltas. Gracias!
    Llegué a la conclusión de que no había respuesta (bueno, no hay manera de establecer los valores alfa de la trama marcadores) y todavía uso mi ag_plot_little_circles función.

    OriginalEl autor

  2. 10

    He aquí algunos ejemplos de código de matlab que hace transparente el diagrama de dispersión de puntos con el parche de objetos:

    x=randn(5000,1)*20;
    y= randn(5000,1)*20;
    t= 0:pi/10:2*pi;
    figure();
    for i=1:size(x)
        pb=patch((sin(t)+ x(i)),(cos(t)+y(i)),'b','edgecolor','none');
        alpha(pb,.1);
    end
    Realmente una buena sugerencia. Me gustaría añadir que, si uno está interesado en la ampliación de la revisión de tamaño, a continuación, basta con aplicar la multiplicación del pecado() o cos() llama, por ejemplo, sin(t)/3 tendrían que hacer los parches más pequeños.

    OriginalEl autor user2149589

  3. 4

    Usted puede ir sobre esto, sin usar el parche. El ejemplo siguiente utiliza el oculto MarkerHandle de permitirle acceder a la transparencia. Todo lo que tienes para ofrecer es el código rgb del color que quieras y el nivel de transparencia en la misma escala. El ejemplo que figura a continuación representa el azar marcadores en un rojo transparente con 10% de opacidad mediante el establecimiento de FaceColorData a uint8(255*[1;0;0;0.1])

    sg = scatter(rand(1000,1),rand(1000,1), 'filled');
    sMarkers=sg.MarkerHandle; %hidden marker handle
    sMarkers.FaceColorData = uint8(255*[1;0;0;0.1]); %fourth element allows setting alpha
    sMarkers.EdgeColorData = uint8(255*[1;0;0;0]); %set edge color in a similar way

    EDIT: parece que MATLAB va a cambiar estas propiedades sin advertencia cuando se cambia de tamaño, guardar…o que al parecer sólo mira divertido.

    Basado en http://undocumentedmatlab.com/blog/plot-markers-transparency-and-color-gradient

    gracias Nikolay 🙂
    Sólo para Matlab 2014 y después.
    Tomar nota de las advertencias sobre el uso de legend y la solución proporcionada en ese mismo blog.

    OriginalEl autor Zach

  4. 1

    Aquí es una función que he usado para crear un semi-transparente de dispersión.

    * Esta es una versión modificada de user2149589 respuesta (un poco más de matlab-friendly).

    function scatterPoints = transparentScatter(x,y,sizeOfCirlce,opacity)
    % usage example:
    % scatterPoints = transparentScatter(randn(5000,1),randn(5000,1),0.1,0.05);
    % set(scatterPoints,'FaceColor',[1,0,0]);
    
    
        defaultColors = get(0,'DefaultAxesColorOrder');
        assert(size(x,2)  == 1 && size(y,2)  == 1 , 'x and y should be column vectors');
        t= 0:pi/10:2*pi;
    
        rep_x = repmat(x',[size(t,2),1]);
        rep_y = repmat(y',[size(t,2),1]);
        rep_t = repmat(t',[ 1, size(x,1)]);
    
        scatterPoints = patch((sizeOfCirlce*sin(rep_t)+ rep_x),(sizeOfCirlce*cos(rep_t)+rep_y),defaultColors(1,:),'edgecolor','none');
        alpha(scatterPoints,opacity);
    
    end

    OriginalEl autor user1557858

  5. 1

    No estoy seguro acerca de las versiones anteriores, pero
    Matlab 2016 parece tener la función que está buscando:

    sg = dispersión(rand(1000,1),rand(1000,1), ‘filled’);

    sg.MarkerFaceAlpha = 0.1;

    OriginalEl autor Matt

  6. 0

    El código de arriba es un poco agradable de la función (para aquellos de nosotros que aún pre-2014b), pero puede ser mejorado con una llamada a ‘DataAspectRatio’ y un ajuste del tamaño de parche para asegurarse de que los círculos se ven como círculos:

    function scatterPoints = transparentScatter(x,y,sizeOfCirlce,opacity)
    % usage example:
    % scatterPoints = transparentScatter(randn(5000,1),randn(5000,1),0.1,0.05);
    % set(scatterPoints,'FaceColor',[1,0,0]);
    
        dRatio = get(gca,'DataAspectRatio');
        dRatio = dRatio(1) / dRatio(2);
        defaultColors = get(0,'DefaultAxesColorOrder');
        assert(size(x,2)  == 1 && size(y,2)  == 1 , 'x and y should be column vectors');
        t= 0:pi/10:2*pi;
    
        rep_x = repmat(x',[size(t,2),1]);
        rep_y = repmat(y',[size(t,2),1]);
        rep_t = repmat(t',[ 1, size(x,1)]);
    
        scatterPoints = patch((dRatio*sizeOfCirlce*sin(rep_t)+ rep_x),(sizeOfCirlce*cos(rep_t)+rep_y),defaultColors(1,:),'edgecolor','none');
        alpha(scatterPoints,opacity);
    
    end

    OriginalEl autor Andrew Bell

Dejar respuesta

Please enter your comment!
Please enter your name here