Open federico-baio opened 10 months ago
I commenti e le puntualizzazioni di @federico-baio meritano sempre un approfondimento.
Parto dall'affermazione
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
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
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
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
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.
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).
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)
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.