2015-10-25 1 views
1

J'essaie d'utiliser cdfplot() pour tracer plusieurs ensembles de données dans un graphique. Quand j'utilise l'axe des x normal, tout va bien. Cependant, lorsque j'essaie de changer l'axe des abscisses en échelle logarithmique, le tracé de cdf de certains ensembles de données ne s'affiche pas complètement. J'ai deux ensembles de données: setFive et setSeven. Je veux tracer la cdf d'eux dans le même graphique, avec l'axe des x étant l'échelle logarithmique.Matlab cdfplof ne montre pas le graphique complet lorsque plusieurs CDD sont tracés dans un graphique avec l'axe des x comme échelle de notation

Voici les deux graphiques, l'un est en axe x normal, l'autre est en échelle logarithmique. Le cdf des "cinq" à l'échelle logarithmique axe x ne va pas à 0.

Normal X-axis

Log scale X-axis

Les deux ensembles de données sont les suivantes:

setSeven = [0,1478 0,2493 0,0650 0,1808 0,3633 0,1684 0,3116 0,1398 0,3069 0,3252 0,1762 0,4192 0,1163 0,2338 0,1388 0,2420 0,1115 0,1530 0,1675 0,3333 0,2351 0.1555 0,1691 0,2042 0,3143 0,2206 0,2288 0,1271 0,1852 0,1226 0,1571 0,1807 0,3231 0.1358 0.1681 0,1924 0,1494 0,1474 0,1030 0,2008 0,1455 0,2351 0,2537 0,1353 0,1320 0,1675 0,1844 0,2691 0,3640 0.2395 0,3156 0,2007 0,4463 0,2526 0,2375 0,3521 0,2279 0];

setFive = [0,1476 0,3300 0,0940 0,2704 0,3659 0,2214 0,3658 0,1402 0,2295 0,2105 0,3324 0,4011 0,2823 0,5740 0,2916 0,1940 0,2559 0,2423 0,1734 0,1992 0,2822 0,4122 0,2312 0,2598 0,3808 0,5833 0,6131 0,2831 0,6418 0,2269 0,2532 0,1944 0,3515 0,2734 0,3908 0,3223 0,3303 0,2759 0,2144 0,1747 0,2721 0,2509 0,2542 0,1381 0,2562 0,1918 0,2243 0,2260 0,3823 0,2404 0,3963 0,2917 0,2390 0,2818 0,2863 0,2366 0,2289 0,1183 0,2660 0,2535 0,1917 0,1976 0,4433 0,3395 0,4199 0,3674 0,2814 0,3816 0,4754 0,3198 0,4995 0,5585 0,2965 0,5316 0,4914 0,6343 0,4036 0,3632 0,420 5 0,3089 0.4521];

Voici les codes:

e=cdfplot(setFive); 
set(e,'LineStyle','-','color','k'); 
hold on; 

g=cdfplot(setSeven); 
set(g,'LineStyle','--','color','k'); 
hold on; 

set(gca,'Xscale','log'); 
axis([0 1 0 1]); 
get(gca,'xlim') 

Répondre

2

Le problème est dû à la transformation de la fonction cdfplot fait sur l'entrée, couplée à la représentation logarithmique.

Considérons l'ensemble de données d'entrée setSeven (le même pour setFive): les 5 premiers des points générés par cdfplot sont:

x7= -Inf   0   0 0.0650 0.0650 
y7= 0   0 0.4300 0.4300 0.4400 

Vous canget ces points en utilisant la fonction get wiht les poignées retournées par cdfplot:

x5=get(e,'xdata'); 
y5=get(e,'ydata'); 
x7=get(g,'xdata'); 
y7=get(g,'ydata'); 

où:

  • x5: x données de setFive ensemble de données
  • y5: les données y à partir de setFive ensemble de données
  • x7: x données de setSeven ensemble de données
  • X7: les données y à partir de setSeven ensemble de données

Dans le premier de votre graphique, vous voyez la ligne commençant à x=0, y=0 puis montant au x=0, y=0.43.

Dans ce graphique, le premier point x=-inf, y=0 est manquant car la fonction de tracé ignore simplement les valeurs telles que -inf, inf, NaN.

Quelque chose de semblable se produit lorsque vous définissez la xaxis échelle comme logarithmic:

Dans ce cas, les 3 premiers points sont ignorés, puisque

log10([-Inf 0 0 0.0650 0.0650]) is [ Inf + 1.3644i -Inf -Inf -1.1871 -1.1871] 

donc, les deux premiers points affichable sur le graphique sont la quatrième et la cinquième qui correspondent à:

x=0.0650, y=0.4300 
x=0.0650, y=0.4400 

les trois premiers points sont alors ignorés.

Comme indiqué au début, cela se produit également pour l'ensemble de données setFive.

Dans ce cas, vous avez:

x5= -Inf  0   0 0.0940 0.0940 
y5= 0   0 0.1900 0.1900 0.2000 

Ainsi, dans le premier graphique, le premier point est pas diplayed et depuis

log10([ -Inf 0 0 0.0940 0.0940]) is Inf + 1.3644i -Inf -Inf -1.0269 -1.0269 

les trois premiers points ne sera pas affiché dans le deuxième graphique (Échelle logarithmique).

En conlcusion, vous avez raison, certains points ne sont pas affichés dans les deux graphiques, mais cela est correct étant donné l'ensemble de données à afficher et la fonction que vous utilisez.

Vous pouvez trouver ci-dessous les deux graphiques zoomés pour mettre en évidence le premier point tracé (setFive en rouge, setSeven en noir).

Zoom du graphique avec xaxis échelle linéaire enter image description here

Zoom du graphique avec xaxis échelle logarithmique enter image description here

Hope this helps.

+0

Merci beaucoup pour votre explication. Maintenant, je comprends que log-scale traite 0 comme -inf donc il omet la partie du graphique. Votre réponse comprend un exemple très concis et du code, je l'apprécie. – Phoebe

1

Eh bien, il fait exactement ce qu'il devrait faire. Le cdf tente de générer une fonction qui imite la distribution de la population de l'échantillon que vous lui avez donné. En règle générale, je préfère utiliser la fonction plot, car elle vous donne plus de puissance et vous avez un contrôle total des données. Donc si vous considérez le code ci-dessous et le chiffre qu'il crée, cela signifie simplement que dans l'espace de journal (où log (0) = -inf) vous ne pouvez pas tracer une valeur de zéro. Par conséquent, seules les valeurs qui diffèrent des zéros sont viables et les autres sont omises dans le graphique.

maintenant si vous trouvez ces derniers dans les deux ensembles de données, en utilisant la ligne suivante

[min(cx5(cx5>0)),min(cx7(cx7>0))] 

vous verrez que Embrasez cinq valeur minimale est beaucoup plus grande que sept fixé. Pensez maintenant à ce qu'est l'espacement des logs lorsque max est un, il accentue les différences qui sont plus proches de zéro au détriment des différences qui sont plus proches de un. Mais en ce qui concerne la cdf, ces résultats sont impressionnants.

Profitez-en.

[cy5,cx5] = ecdf(setFive); 
[cy7,cx7] = ecdf(setSeven); 
subplot(221) 
plot(cx5,cy5,'LineStyle','-','color','k');hold on 
plot(cx7,cy7,'LineStyle','--','color','k');hold off 
ylabel('F(x)'); xlabel('x');title('Empirical CDF'); 
axis([0 1 0 1]) 
subplot(222) 
plot(cx5,cy5,'LineStyle','-','color','k');hold on 
plot(cx7,cy7,'LineStyle','--','color','k');hold off 
ylabel('F(x)'); xlabel('x');title('Empirical CDF'); 
set(gca,'Yscale','log'); 
axis([0 1 0 1]) 
subplot(223) 
plot(cx5,cy5,'LineStyle','-','color','k');hold on 
plot(cx7,cy7,'LineStyle','--','color','k');hold off 
ylabel('F(x)'); xlabel('x');title('Empirical CDF'); 
set(gca,'Xscale','log'); 
axis([0 1 0 1]) 
subplot(224) 
plot(cx5,cy5,'LineStyle','-','color','k');hold on 
plot(cx7,cy7,'LineStyle','--','color','k');hold off 
ylabel('F(x)'); xlabel('x');title('Empirical CDF'); 
set(gca,'Xscale','log','Yscale','log'); 
axis([0 1 0 1]) 

the different options you can plot

+0

Merci pour vos parcelles! J'apprécie vraiment la comparaison entre ces graphiques, c'est très clair! J'ai une question de suivi et j'apprécie vraiment que vous puissiez m'aider avec. La raison pour laquelle je voulais utiliser l'axe des abscisses log-scale est que, j'ai plus de jeux de données et la cdf de celles-ci vont de [0 10] en abscisse, mais sont encombrées dans l'intervalle x [0 1] Donc, je voulais agrandir cet intervalle en utilisant log-scale .. Cependant, j'ai besoin de montrer quel est le pourcentage de "0" dans l'ensemble de données. Donc, de toute façon, je peux tracer plusieurs graphes Cdf avec des axes x inégaux? Merci d'avance pour votre temps. – Phoebe

+0

vous devez créer une nouvelle question avec l'exemple de données – eyalsoreq