UniprJRC / DSconMATLAB

Il sito che contine materiale aggiuntivo e tutti i files di codice MATLAB degli esercizi e delle figure del libro.
12 stars 5 forks source link

appunto esercizio 9.1 pagina 284 #245

Open federico-baio opened 10 months ago

federico-baio commented 10 months ago

Nell'esercizio viene indicato un modo alternativo per inserire i nomi delle righe come intestazione delle barre (riga 25 del codice) ma utilizzando quel metodo, i mesi vengono inseriti in ordine alfabetico (a mio parere non rendendo chiara la lettura). Oltretutto con il metodo alternativo si produce un grafico che non risponde alla richiesta dell'esercizio, di far passare l'asse delle ascisse per la media delle vendite (allego foto del risultato ottenuto con il metodo alternativo indicato dal libro)

grafico

Ho provato a scrivere il metodo alternativo per ottenere il grafico attribuendo la proprietà categorical al vettore che contiene i nomi delle righe, tenendo conto di quanto riportato sopra:

bar(categorical(X.Properties.RowNames,X.Properties.RowNames),X{:,1},'BaseValue',mx)

oppure (e ritengo questa soluzione più rapida) si può inserire direttamente il nome del vettore creato precedentemente, contenente i nomi delle righe

bar(categorical(rownam,rownam),X{:,1},'BaseValue',mx)

In entrambi i casi, il grafico ottenuto è uguale a quello che avrei ottenuto usando la funzione "get current axes". Spero di non essere risultato presuntuoso con il mio tentativo di provare a riscrivere il metodo alternativo. Buona serata.

UniprJRC commented 10 months ago

I commenti e le puntualizzazioni di @federico-baio meritano sempre un approfondimento.

Parto dall'affermazione


Oltretutto con il metodo alternativo si produce un grafico che non risponde alla richiesta dell'esercizio, di far passare l'asse delle ascisse per la media delle vendite

Il metodo alternativo si riferisce solo alle etichette sull'asse delle ascisse. Il 'Name',Value 'Basevalue',ValoreNumericoDaInserire ovviamente rimane sempre indipendentemente dal metodo scelto.

Sono d'accordo tuttavia che la riga del codice del libro di p. 28

image

o andava omessa oppure andava inserita l'istruzione completa

% bar(categorical(X.Properties.RowNames,X.Properties.RowNames),X{:,1})

Naturalmente come fa notare correttamente @federico-baio dato che X.Properties.RowNames era già stato definito prima alla riga 3 come rownam l'istruzione più semplice è

bar(categorical(rownam,rownam),X{:,1})

Quest'ultimo punto riga riguarda quello che si chiama "complessità ciclomatica del codice". Nel mondo del MATLAB cody https://it.mathworks.com/matlabcentral/content/cody/about.html

MATLAB mette a disposizione una serie di problemi. La graduatoria nel mondo dei risolutori è alla pagina

https://it.mathworks.com/matlabcentral/cody/players

Se volte potete cercare anche il nome dello scrivente e/o quella di qualsiasi altro utente che utilizza MATLAB. L'obiettivo nel MATLAB cody è risolvere i problemi con il minor numero possibile di istruzioni. Il codice che ne risulta è completamente illeggibile. Nel libro l'approccio che viene utilizzato è quello di illustrare le metodologie e di mostrare il codice in modo tale che possa essere il più chiaro possibile.

In ogni caso, tornando al nostro caso, il commento di @federico-baio mi dà l'opportunità di segnalare la differenza tra la chiamata a categorical con uno o due argomenti di input

categorical(pippo) trasforma pippo in un vettore categorico in cui le modalità di pippo sono ordinate in ordine alfabetico

categorical(pippo, topolino) trasforma pippo in un vettore categorico in cui le modalità di pippo sono ordinate secondo l'ordine determinato dagli elementi del vettore topolino

Di conseguenza, dato che

image

nell'istruzione

categorical(X.Properties.RowNames)

l'ordine delle modalità è Ago (in quanto Ago è il primo in base all'ordinamento alfabetico) Apr (in quanto Apr è il secondo in base all'ordinamento alfabetico) ... Set (in quanto Set è l'ultimo in base all'ordinamento alfabetico)

Al contrario categorical(X.Properties.RowNames,X.Properties.RowNames)

specifca che la prima modalità da considerare nell'ordinamento è X.Properties.RowNames(1) ossia Gen la seconda modalità da considerare nell'ordinamento è X.Properties.RowNames(2) ossia Feb ....

L'obiettivo dell'Esercizio 9.1 era quello di non distogliere il lettore dall'argomento dei grafici ma farlo cominciare a riflettere sull'istruzione categorical. Nell'esercizio 9.3 questo argomento viene ripreso

image

Dopo il commento di @federico-baio (ancora una volta e come sempre assolutamente corretto) nella nuova edizione del libro chiedo se sia meglio A) approfondire direttamente l'istruzione categorical nell'Esercizio 9.1 oppure B) nell'Esercizio 9.1 eliminare solo la riga 28 e lasciare le righe 25-27 come segue

image

C) fare un esercizio precedente incentrato su categorical chiamato con uno o due argomenti di input e richiamare questo esercizio

D) proposta alternativa

Fatemi sapere qual è la vostra preferenza tra A, B, C o D. Grazie a tutti coloro che vorranno partecipare e grazie ancora una volta a @federico-baio per avere sollevato la questione.

federico-baio commented 10 months ago

Trovo che l'opzione più efficace sia la A; ossia approfondire direttamente l'istruzione categorical nell'esercizio 9.1. Questo in modo da avere una spiegazione efficace dell'istruzione, senza dover aspettare gli esercizi successivi, e quindi riuscire a risolvere l'esercizio 9.1 anche con il metodo alternativo (ottenendo lo stesso risultato del metodo principale: quindi con l'ordine dei mesi corretto).