Plot di 2 assi y con un asse x

di il
14 risposte

Plot di 2 assi y con un asse x

Salve,
Ho due grafici differenti che usufruiscono dello stesso asse x ma con due assi distinti y. Volevo plottare questi valori sullo stesso grafico ridimensionando i 2 assi y per fare in modo che abbiano la stessa dimensione. Ovviamente vorrei anche mettere l'etichetta differente per ogni asse y a sinistra e a destra, riesce a darmi la mano qualcuno?? grazie!

14 Risposte

  • Re: Plot di 2 assi y con un asse x

    Puoi usare la funzione plotyy
  • Re: Plot di 2 assi y con un asse x

    Si avevo letto a riguardo della funzione plotyy ma non sono riuscito ad implementarla in modo giusto nel mio caso.
    Il codice che ho usato per creare la funzione è questo:
    function corpot
    %axis([0 2.5 0 1.4]);hold on
    axis([0 2.5 0 2.8]);hold on
    Isc=1.27; %corrente di corto circuito, [mA]
    Io=1e-19; %corrente di irraggiamento, da verificare
    q=1.6e-19; %carica dell'elettrone, [C]
    k=1.38e-23; %costante di Boltzmann, [J/K]
    T=298; %temperatura, [K]
    V=0:.001:2.28; %tensione circuito aperto [V]
    n=2; %fattore di idealità
    for i=1:length(V)
        I(i)=Isc-Io*(exp(V(i)*q/(n*k*T))-1);
        P(i)=V(i)*I(i);
    end
    plot(V,I,'k');
    plot(V,P,'r');
    %xlabel('Voltage (V)')
    %ylabel('Current Density (mA/cm^2)')
    %ylabel('Power Density (mW/c^2)')
    title('Caratteristica J-V e P-V in STC')
    legend({'Current Density','Potenz Density'})
    a sinistra deve esserci la Current Density a destra inceve la Power Density e gli assi devono avere i valori di sinistra che vanno da 0 a 1.4 e a destra i valori che vanno da 0 a 2.8.

    Sapresti indirizzarmi in che modo utilizzare la funzione plotyy? ti ringrazio...
  • Re: Plot di 2 assi y con un asse x

    Così fai il plot:
    [AX,H1,H2] = plotyy(V,I,V,P,'plot');
    Se poi cerchi sull'help di matlab "plotyy" c'è un esempio abbastanza completo che ti spiega come impostare le label degli assi, titoli e stili e colori delle linee.
  • Re: Plot di 2 assi y con un asse x

    Rieccomi sconfortato....non sono riuscito ad ottenere quello che volevo.
    Con questo codice usato per il plotyy:
    [AX,H1,H2] = plotyy(V,I,V,P,'plot');
    set(get(AX(1),'Ylabel'),'String','Current Density (mA/cm^2)','Color','k') 
    set(get(AX(2),'Ylabel'),'String','Power Density (mW/c^2)','Color','k') 
    xlabel('Voltage (V)') 
    title('Caratteristica J-V e P-V in STC')
    set(H1,'LineStyle','-','Color','k')
    set(H2,'LineStyle','-','Color','r')
    
    Ho i seguenti problemi:
    -L'asse di sinistra è di color blu e non nero ma l'estensione è giusta cioè parte da 0 a 1.4 come volevo con intervallo da 0.2;
    -L'asse di destra è di color verde e non nero e l'estensione è sbagliata, infatti parte da -0.5 e arriva a 3 con intervalli di 0.5 invece vorrei che partisse anch'esso da 0 e finisse a 2.8 con intervallo da 0.4.
    Come posso risolvere?? dovrei usare credo il comando axis ma quello interviene solo su quello di sinistra mi sembra...grazie dell'aiuto
  • Re: Plot di 2 assi y con un asse x

    Allora guarda sull'help in fondo alla voce plotyy, c'è un link "Using Multiple X- and Y- axes" che ti spiega come creare manualmente gli assi supplementari in modo da poterli gestire sia per quanto riguarda i colori che i limiti e gli intervalli.
  • Re: Plot di 2 assi y con un asse x

    Si avevo letto quella pagina ma non mi è stato molto d'aiuto...non sono riuscito a scrivere il codice in maniera decente mi dava ulteriori problemi...
  • Re: Plot di 2 assi y con un asse x

    E' abbastanza semplice...
    Per il primo grafico basta copiare quello che c'è scritto nell'help, sostituire i nomi delle variabili e aggiustarti i colori come preferisci.
    Per il secondo grafico, copi la riga dell'help con la funzione line dove viene inserita la proprietà 'Parent' per dirgli a quale asse deve fare riferimento e a questo punto dovrebbe darti solo un problema con la distribuzione dei valori sull'asse di destra. Con la funzione set su ax2 e le proprietà 'YLim' e 'YTick' sistemi l'asse.
  • Re: Plot di 2 assi y con un asse x

    Ancora qui...sono riuscito solo ad impostare solo il comando della prima Y:
    ax1=gca;
    set(ax1,'XColor','k','YColor','k')
    èd ho effettivamente l'asse di sinistra nero...ma non c'è verso di usare l'altro comando per l'asse destro: ho usato cosi:
    ax2 = axes('Position','XAxisLocation','top','YAxisLocation','right','XColor','k','YColor','k');
    hl2 = line(P,'Color','k','Parent',ax2);
    set(ax2,'YTick',0:0.4:2.8)
    ma non cambia assolutamente niente.
    Ps. Io non ho bisogno di 2 assi x ma solo di un asse x e due y...
    Giug ti chiedo visto che sei sicuramente molto più esperto del sottoscritto, come scriveresti il codice tu? grazie
  • Re: Plot di 2 assi y con un asse x

    Per non avere il secondo asse x basta togliere la riga XAxisLocation 'top'. Poi, ti mancava solo il set dell'YLim prima dell'YTick (come ti avevo suggerito...).
    Questo mi sembra che faccia quello che chiedi:
    
    gr1=line(V,I, 'Color', 'k');
    ax1=gca;
    ax2 = axes('Position',get(ax1,'Position'), 'YAxisLocation','right', 'Color','none', 'XColor','k','YColor','k');
    gr2 = line(V,P,'Color','r','Parent',ax2);
    set(ax2, 'YLim',[0 2.8], 'YTick',0:0.4:2.8);
    
  • Re: Plot di 2 assi y con un asse x

    Ci siamo quasi...
    ora ho 2 caratteristiche della potenza...verde e con asse verde che si intromette...
    non so come si postano le immagini ma se fai partire tutto il codice lo puoi notare tu stesso:
    function corpot
    axis([0 2.5 0 1.4]);hold on
    Isc=1.27; %corrente di corto circuito, [mA]
    Io=6.938299e-20; %corrente di saturazione del diodo, [mA]
    q=1.602e-19; %carica dell'elettrone, [C]
    k=1.381e-23; %costante di Boltzmann, [J/K]
    T=298; %temperatura, [K]
    V=0:.001:2.28; %tensione circuito aperto [V]
    n=2; %fattore di idealità
    for i=1:length(V)
        I(i)=Isc-Io*(exp(V(i)*q/(n*k*T))-1);
        P(i)=V(i)*I(i);
    end
    [AX,H1,H2] = plotyy(V,I,V,P,'plot');
    set(get(AX(1),'Ylabel'),'String','Current Density (mA/cm^2)','Color','k') 
    set(get(AX(2),'Ylabel'),'String','Power Density (mW/c^2)','Color','k') 
    xlabel('Voltage (V)') 
    title('Caratteristica J-V e P-V in STC')
    %set(H1,'LineStyle','-','Color','k')
    %set(H2,'LineStyle','-','Color','r')
    %legend({'Current Density','Potenz Density'})
    ax1=gca;
    gr1=line(V,I, 'Color', 'k');
    
    ax2 = axes('Position',get(ax1,'Position'), 'YAxisLocation','right', 'Color','none', 'XColor','k','YColor','k');
    gr2 = line(V,P,'Color','r','Parent',ax2);
    set(ax2, 'YLim',[0 2.8], 'YTick',0:0.4:2.8);
    non so come ringraziarti per l'aiuto
  • Re: Plot di 2 assi y con un asse x

    Devi togliere il plotyy! non serve più, viene completamente sostituito dalle due righe che usano la funzione line e devi quindi adattare il codice che scrive le label sugli assi a quello che ti ho scritto prima.
  • Re: Plot di 2 assi y con un asse x

    Grazie!! tutto perfetto...tranne per la legenda che prende solo un dato...
  • Re: Plot di 2 assi y con un asse x

    Devi passare come primo argomento della funzione legend un vettore con gli handle dei grafici (dato che sono stati creati separatamente).
    legend([gr1 gr2],{'Current Density','Power Density'})
    
  • Re: Plot di 2 assi y con un asse x

    Perfetto....l'avevo inteso dopo. Mille grazie!
Devi accedere o registrarti per scrivere nel forum
14 risposte