Plot con 2 assi Y e 2 assi X

di il
24 risposte

Plot con 2 assi Y e 2 assi X

Salve a tutti,

dovrei fare un plot in matlab in cui sull'asse X ho la deflessione di certe particelle dovuta ad un campo magnetico e sull'asse Y quella dovuta ad un campo elettrico.
La deflessione elettrica mi da info sull'energia e quella magnetica sul momento, quindi vorrei fare un asse Y a sinistra che corrisponde all'energia e un asse X in alto che corrisponde al momento.

usando il seguente codice la cosa più o meno la faccio solo che il risultato è un grafico pieno di overlap come potete vedere dall'immagine allegata

%%%% doppio Asse x
xlabel(gca, 'Deflessione magnetica [m]'); % label lower x axis
set(gca,'Box','off');   % Turn off the box surrounding the whole axes
axesPosition = get(gca,'Position');          %# Get the current axes position
hNewAxes = axes('Position',axesPosition,...  %# Place a new axes on top...
                'Color','none',...           %#   ... with no background color
                'XAxisLocation','top',...    %#   ... located on the top
                'Ytick', [],...              %#   ... with no x tick marks
                'Box','off');                %#   ... and no surrounding box
            
            xlabel(hNewAxes,'Quantità di moto');  %# Add a label to the top axis
         
            
%%%% doppio Asse y            
ylabel(gca,'Deflessione elettrica [m]');

set(gca,'Box','off');   % Turn off the box surrounding the whole axes
axesPosition = get(gca,'Position');          %# Get the current axes position
hNewAxes = axes('Position',axesPosition,...  %# Place a new axes on top...
                'Color','none',...           %#   ... with no background color
                'YAxisLocation','right',...  %#   ... located on the right
                'Xtick', [],...              %#   ... with no y tick marks
                'Box','off');                %#   ... and no surrounding box
            
            ylabel(hNewAxes,'Energia');  %# Add a label to the top axis
Le mie domande sono:
1) come faccio a evitare gli overlap tra i label degli assi, la legenda e il titolo dell'imagine? (potrei sistemare il tutto dalle proprietà dell'immagine, ma vorrei sapere se c'è un modo di farmi fare il plot da matlab direttamente)
2) le scale del secondo asse X e del secondo asse Y dovrebbero essere variabili: cioè io vorrei che lo script mi desse le info su energia e impulso in base ad una certa relazione matematica, come si fa?
in questo momento la scala è fissa e non si adatta se ridimensiono le immagini (i secondi assi hanno lungheza fissa).
3) gli asterischi rappresentano lo spot lasciato dalle particelle su un rivelatore e la grandezza varia. Questo va bene nel grafico, ma si ripercuote nella legenda. come faccio a fissare il size degli asterischi nella legenda?

Sono un neofita totale con matlab ed ho poca esperienza di programmazione, quindi vi prego di essere il più dettagliati possibile.

Grazie
Allegati:
9724_52edaba4c03afe43c87989f033a27a4d.jpg
9724_52edaba4c03afe43c87989f033a27a4d.jpg

24 Risposte

  • Re: Plot con 2 assi Y e 2 assi X

    1. In genere le label della figura hanno posizioni variabili a seconda della dimensione della finestra che le contiene. Stai lavorando con uno schermo piccolo? Vorresti fare in modo che utilizzando un comando di "non overlap" matlab sistemasse tutto automaticamente? O intendi dire che vuoi spostare le label da codice e non con l'editor visuale?
    2. Se calcolassi i limiti minimo e massimo delle scale secondarie in funzione dei limiti minimo e massimo degli assi principali sarebbe corretto? O è diversa la scala (ad es. è logaritmica, mentre la principale è lineare?)
    3. Questo dovrebbe essere più semplice, devi avere un output della funzione plot.
    hplot=plot(...)
    l=legend(hplot);
    a=get(l,'children');
    set(a(1),'markersize',20);
    
    Ovviamente devi modificare il markersize alla dimensione che vuoi tu.
  • Re: Plot con 2 assi Y e 2 assi X

    giug ha scritto:


    1. In genere le label della figura hanno posizioni variabili a seconda della dimensione della finestra che le contiene. Stai lavorando con uno schermo piccolo? Vorresti fare in modo che utilizzando un comando di "non overlap" matlab sistemasse tutto automaticamente? O intendi dire che vuoi spostare le label da codice e non con l'editor visuale?
    Lo schermo è un 15 pillici.
    Vorrei usare un comando di "non overlap"

    giug ha scritto:


    2. Se calcolassi i limiti minimo e massimo delle scale secondarie in funzione dei limiti minimo e massimo degli assi principali sarebbe corretto? O è diversa la scala (ad es. è logaritmica, mentre la principale è lineare?)
    Si, sarebbe corretto.
    Le scale sono lineari, ad esempio y = (carica*campo*distanza)/energia

    giug ha scritto:


    3. Questo dovrebbe essere più semplice, devi avere un output della funzione plot.
    hplot=plot(...)
    l=legend(hplot);
    a=get(l,'children');
    set(a(1),'markersize',20);
    
    Ovviamente devi modificare il markersize alla dimensione che vuoi tu.
    Non riesco a implementarlo correttamente... mi elimina il nome degli assi e tutte le label ma il size della legenda rimane quello degli spot sul grafico..
    ho fatto così:
    
    hplot = plot(yH(1,:),xH(1,:),'^',yC(:,1),xC(:,1),'*',yC(:,2),xC(:,2),'*',yC(:,3),xC(:,3),'*',yC(:,4),xC(:,4),'*',yC(:,5),xC(:,5),'*',yC(:,6),xC(:,6),'*','MarkerSize',s);
    l=legend(hplot);
    a=get(l,'children');
    set(a(1),'markersize',20);
    
    prima facevo
    
    plot(yH(1,:),xH(1,:),'^',yC(:,1),xC(:,1),'*',yC(:,2),xC(:,2),'*',yC(:,3),xC(:,3),'*',yC(:,4),xC(:,4),'*',yC(:,5),xC(:,5),'*',yC(:,6),xC(:,6),'*','MarkerSize',s);
    hold on
    plot(Ymcporigine,Xmcporigine,'k-','MarkerEdgeColor','k','MarkerSize',1); %Plot contorno MCP
    hold off
    %legend('H+','C1+','C2+','C3+','C4+','C5+','C6+','contorno MCP', 'Location','BestOutside');
    
    yH, xH sono deflessioni per protoni
    yC, xC sono deflessioni per ioni carboni
  • Re: Plot con 2 assi Y e 2 assi X

    Ok, cerchiamo di risolvere un problema alla volta, probabilmente è anche una questione di ordinamento delle istruzioni.
    Io ho provato così:
    
    figure()
    yH=1:10;
    xH=yH.^2;
    figure();
    hplot = plot(yH(1,:),xH(1,:),'^','MarkerSize',10);
    l=legend(hplot);
    a=get(l,'children');
    set(a(1),'MarkerSize',20);
    
    Prova questo, senza tutto il resto del codice, e dovrebbe funzionare. Poi, prova a sostituire yH e xH con i tuoi valori, e vedi se funziona, poi aggiungi anche gli altri yC e xC, poi aggiungi i titoli ecc. in modo da capire dov'è l'errore.
    Fammi sapere in quale punto non fa più quello che dovrebbe.
  • Re: Plot con 2 assi Y e 2 assi X

    Allora, quando aggiungo tutti gli yC e xC ridimensiona solo l'ultima riga della legenda.
    Titoli e altro rimane overlappato come prima.


    
    hplot = plot(yH(1,:),xH(1,:),'^', yC(:,1),xC(:,1),'*',yC(:,2),xC(:,2),'*',...
        yC(:,3),xC(:,3),'*',yC(:,4),xC(:,4),'*',yC(:,5),xC(:,5),'*',...
        yC(:,6),xC(:,6),'*','MarkerSize',s); % Markersize: specifys the size of the marker in points (s in questo caso)
    hold on 
    plot(Ymcporigine,Xmcporigine,'k-','MarkerEdgeColor','k','MarkerSize',1); %Plot contorno MCP
    
    l=legend(hplot, 'H+','C1+','C2+','C3+','C4+','C5+','C6+', 'Location','BestOutside');
    a=get(l,'children');
    set(a(1),'MarkerSize',10);
    
    Se scrivo set(a(7),'MarkerSize',10) ridimensiona la terz'ultima icona della legenda
    Credo, a questo punto che il problema sia nei valori corretti da inserire nell'istruzione set...
    Allegati:
    9724_a2bc5af124af3adfe619fa8fbc9d5cff.jpg
    9724_a2bc5af124af3adfe619fa8fbc9d5cff.jpg
  • Re: Plot con 2 assi Y e 2 assi X

    Ok, perfetto.
    Prova a scrivere l'istruzione set così:
    set(a(1:3:end),'MarkerSize',10);
    Poi scegli tu il valore del markersize.
  • Re: Plot con 2 assi Y e 2 assi X

    Grande!
    è venuta un gioiellino!
    Grazie!



    Per il resto?
    come si fa?
    sono parecchio una schiappa con sta roba...
  • Re: Plot con 2 assi Y e 2 assi X

    Bene! (Tranquillo neanche io le so queste cose ma con il tempo si impara a... cercare sull'help)
    Passiamo al punto 2.
    Per definire i limiti dei due assi devi semplicemente aggiungere una riga alle proprietà di axes.
    Quando fai l'asse x aggiungi:
    hNewAxes = axes('Position',axesPosition,... %# Place a new axes on top...
    'Color','none',... %# ... with no background color
    'XAxisLocation','top',... %# ... located on the top
    'Ytick', [],... %# ... with no x tick marks
    'Box','off',...
    'XLim', [limite_inferiore limite_superiore]);

    dove limite_superiore e limite_inferiore li calcoli con la tua formula. Magari prova prima a metterci direttamente due numeri, tipo [0 20] e guarda il risultato, poi li sostituisci con una variabile.
  • Re: Plot con 2 assi Y e 2 assi X

    Bene, il punto 1 lo posso risolvere dall'edit dell'immagine, non vale nemmeno la pena perdere tempo...
    come limite inferiore ho lo 0, ora vedo come fare per il limite superiore.
    Ti faccio sapere quanto prima.
    Grazie
  • Re: Plot con 2 assi Y e 2 assi X

    Hai provato a mettere la legenda all'interno della figura? (per capire se la sovrapposizione delle label dipende da quello)
  • Re: Plot con 2 assi Y e 2 assi X

    Sì, ho provato mettendo 'Best' anzicchè 'BestOutside', ma non cambia nulla per quanto riguarda gli overlap
  • Re: Plot con 2 assi Y e 2 assi X

    Intanto se porti le xlabel e ylabel degli assi principali subito dopo la funzione plot dovrebbero non sovrapporsi più.
  • Re: Plot con 2 assi Y e 2 assi X

    Ho risolto gli overlap delle label degli assi come hai detto tu. La legenda va bene, rimane l'overlap del titolo del grafico con la label del secondo asse x. Ho provato a metterre l'istruzione del titolo dopo le istruzioni per fare gli assi secondari ma non cambia nulla. Comunque poco male, lo risolvo dall'edit del plot manualmente.

    Sono stato impegnato con delle misure collegate a questa simulazione che hanno preso due giorni interi quindi non ho toccato il programma però ho riflettuto su come sistemare la scala degli assi secondari. Mi sono reso conto che la scala secondaria dovrebbe dare valori differenti per le diverse paricelle perchèc'è una dipendenza dal rapporto carica/massa che cambia per i C e gli H, quindi credo che diventa un problema folle e non voglio diventare cretino. Allora ho deciso di provare a fare una scala solo per gli H come mi hai suggerito tu sopra e poi si fanno i conti da un'altra parte per le altre particelle, che mi sa che è più semplice.

    Provo e ti dico che combino.
    Grazie dell'aiuto
  • Re: Plot con 2 assi Y e 2 assi X

    Considera che qualunque cosa fai dall'editor del plot puoi farlo anche da codice, ad esempio impostando la proprietà position della label. Se ad esempio devi salvare l'immagine da codice per fare diverse simulazioni può essere comodo non dover ricorrere all'editor manuale. Ovviamente dipende da quello che ti serve. Se ti serve l'immagine finale una sola volta probabilmente non vale neanche la pena.

    Anche per quanto riguarda gli assi, forse complicare troppo il plot lo rende anche poco leggibile, al massimo puoi fare grafici diversi.

    Buon lavoro!
  • Re: Plot con 2 assi Y e 2 assi X

    Mi sono accorto di una cosa interessante: mettendo l'istruzione del titolo subito dopo le istruzioni per l'asse x secondario effettivamente non mi overlappa più con la label dell'asse, ma il titolo viene stampato troppo in alto, come si vede ingrandendo la figura al massimo (vedi allegato)

    Per le scale degli assi ho anche pensato di ricorre alla seguente soluzione: la linea curva che vedi rappresenta la superfice attiva del rivelatore che usiamo, quelle che finiscono fuori non le vediamo, quindi io restringerei le scale a quella porzione fregandomene di quello che succede fuori, che forse è anche la soluzione più semplice ora ci studio un pò.

    Grazie sempre dell'aiuto e dei consigli.
    Allegati:
    9724_5d48ef6833aeb335a6454d6f55344464.jpg
    9724_5d48ef6833aeb335a6454d6f55344464.jpg
Devi accedere o registrarti per scrivere nel forum
24 risposte