[R] Order axis by number of entries in lattice plot

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Mon Nov 4 15:32:40 CET 2019


On 04/11/2019 9:25 a.m., Duncan Murdoch wrote:
> On 04/11/2019 8:31 a.m., Luigi Marongiu wrote:
>> Dear all,
>> I am plotting some values with lattice barchart: the y-axis is
>> automatically ordered alphabetically; is it possible to order the
>> entries by number, so that the 'larger' histograms would be at the top
>> of the plot?
>> This is a working example
>>
>> ```
>> library(lattice)
>> Family = c("Adenoviridae", "Baculoviridae",  "Herpesviridae",   "Mimiviridae",
>> "Myoviridae", "Pandoraviridae",  "Phycodnaviridae", "Podoviridae",
>> "Polydnaviridae",  "Retroviridae", "Siphoviridae",    "Unassigned")
>> Normal = c(7, 15, 24,  8, 65, 24, 17, 16,  8, 15, 49 , 9)
>> Tumour =c(  17,  75,  94,  14, 242,  28,  41,  69,  12,  11, 305,  51)
>> Metastasis =c(41,  66,  95,   3, 173,  22,  33, 101,  12,  12, 552,  57)
>> df = data.frame(Family, Normal, Tumour, Metastasis, stringsAsFactors = FALSE)
>> COLS = c("darkolivegreen3", "brown3", "darkorchid3")
>> barchart(Family ~ Normal+Tumour+Metastasis, data = df, stack = TRUE,
>>            xlim=c(1,1000),
>>            main = "Alphabetical order",
>>            xlab = expression(bold("Number of species")),
>>            ylab = expression(bold("Families")),
>>            auto.key = list(space = "top", columns=3),
>>            par.settings = list(superpose.polygon = list(col = COLS)))
>> ```
>>
>>
> 
> You could do it by using an ordered factor.  For example,
> 
> o <- order(Normal + Tumour + Metastasis)
> df$Ordered <- ordered(Family, levels = Family[o])
> barchart(Ordered ~ Normal+Tumour+Metastasis, data = df, stack = TRUE,
>            xlim=c(1,1000),
>            main = "Ordered by total",
>            xlab = expression(bold("Number of species")),
>            ylab = expression(bold("Families")),
>            auto.key = list(space = "top", columns=3),
>            par.settings = list(superpose.polygon = list(col = COLS)))
> 
> Duncan Murdoch
> 

Sorry, I meant to add:  you don't need to use an ordered factor for the 
plot.  A regular factor with the levels in the order you want is fine, 
i.e. you could use

df$Ordered <- factor(Family, levels = Family[o])

However, there are some other operations (e.g. comparison using ">") 
that do require the ordered factor.

Duncan Murdoch



More information about the R-help mailing list