[R] Grouped AND stacked bar charts possible in R?

Ivailo Partchev Ivailo.Partchev at uni-jena.de
Wed Jun 23 14:33:27 CEST 2004


This may have been answered before, but a nice possibility to plot the 
Titanic data is offered by "mosaic plots", as introduced (I think) by 
John Hartigan and implemented in the VCD package

Ivailo Partchev
Jena

Marc Schwartz wrote:

>On Tue, 2004-06-22 at 10:54, Patrick Lenon wrote:
>  
>
>>Good day all,
>>
>>My statisticians want an R procedure that will produce grouped stacked 
>>barplots.  Barplot will
>>stack or group, but not both.  The ftable function can produce a table
>>of the exact form they want, but the barplot doesn't show all the
>>divisions we want.
>>
>>For an example, here's the sample from the help file for "ftable:"
>> 
>>data(Titanic)
>>ftable(Titanic, row.vars = 1:3)
>>ftable(Titanic, row.vars = 1:2, col.vars = "Survived")
>>ftable(Titanic, row.vars = 2:1, col.vars = "Survived")
>>
>>Now take it a step further to try to add another dimension:
>>
>>b <- ftable(Titanic, row.vars=1:3)
>>
>>                   Survived  No Yes
>>Class Sex    Age                  
>>1st   Male   Child            0   5
>>             Adult          118  57
>>      Female Child            0   1
>>             Adult            4 140
>>2nd   Male   Child            0  11
>>             Adult          154  14
>>      Female Child            0  13
>>             Adult           13  80
>>3rd   Male   Child           35  13
>>             Adult          387  75
>>      Female Child           17  14
>>             Adult           89  76
>>Crew  Male   Child            0   0
>>             Adult          670 192
>>      Female Child            0   0
>>             Adult            3  20
>>
>>barplot(b)
>>barplot(b, beside=T))
>>
>>Neither resulting barplot is satisfactory.  The first stacks all the
>>subdivisions of "Survived = Yes" and "Survived = No" together.  The
>>second is closer because it creates two groups, but it lists
>>combinations side-by-side that we'd like stacked. In the above example
>>"No" and "Yes" would be stacked on bars labeled "Male" or "Female"
>>in groups by Class.
>>
>>I've taken a look through the R-Help archives and looked through the
>>contributed packages, but haven't found anything yet.
>>
>>If you have any thoughts how we might produce groups of stacked bars
>>from an ftable, we would appreciate it.
>>    
>>
>
>
>I think that you are trying to plot too much information in a single
>graphic. The result of a multi-dimensional barplot is likely to be very
>difficult to interpret visually.
>
>You would likely be better served to determine, within the multiple
>dimensions, what your conditioning and grouping dimensions need to be
>and then consider a lattice based plot.
>
>I would urge you to consider using either barchart() or perhaps
>dotplot() in lattice, which are designed to handle multivariable charts
>of this nature.
>
>Use:
>
>library(lattice)
>
>Then for general information
>
>?Lattice
>
>and then
>
>?barchart
>
>for more function specific information and examples of graphics with
>each function.
>
>For the Titanic data that you have above, you could do something like:
>
># Convert the multi-dimensional table to a 
># data frame. Assumes you have already done
># data(Titanic)
>MyData <- as.data.frame(Titanic)
>
># Take a look at the structure
>MyData
>
>   Class    Sex   Age Survived Freq
>1    1st   Male Child       No    0
>2    2nd   Male Child       No    0
>3    3rd   Male Child       No   35
>4   Crew   Male Child       No    0
>5    1st Female Child       No    0
>6    2nd Female Child       No    0
>7    3rd Female Child       No   17
>8   Crew Female Child       No    0
>9    1st   Male Adult       No  118
>10   2nd   Male Adult       No  154
>11   3rd   Male Adult       No  387
>12  Crew   Male Adult       No  670
>13   1st Female Adult       No    4
>14   2nd Female Adult       No   13
>15   3rd Female Adult       No   89
>16  Crew Female Adult       No    3
>17   1st   Male Child      Yes    5
>18   2nd   Male Child      Yes   11
>19   3rd   Male Child      Yes   13
>20  Crew   Male Child      Yes    0
>21   1st Female Child      Yes    1
>22   2nd Female Child      Yes   13
>23   3rd Female Child      Yes   14
>24  Crew Female Child      Yes    0
>25   1st   Male Adult      Yes   57
>26   2nd   Male Adult      Yes   14
>27   3rd   Male Adult      Yes   75
>28  Crew   Male Adult      Yes  192
>29   1st Female Adult      Yes  140
>30   2nd Female Adult      Yes   80
>31   3rd Female Adult      Yes   76
>32  Crew Female Adult      Yes   20
>
># Now do a plot. Use 'library(lattice)' here first
># if you had not already done so above for help.
>barchart(Freq ~ Survived | Age * Sex, groups = Class, data = MyData,
>         auto.key = list(points = FALSE, rectangles = TRUE, space
>         = "right", title = "Class", border = TRUE), xlab = "Survived",
>         ylim = c(0, 800))
>
>The above barchart will create a four panel plot, where the four main
>panels will contain the combinations of Sex and Age. Within each panel
>will be two groups of bars, one each for the Survived Yes/No status.
>Within each group will be one bar for each Class. 
>
>That is one quick way of grouping things, but you can alter that and
>other plot attributes easily.
>
>HTH,
>
>Marc Schwartz
>
>______________________________________________
>R-help at stat.math.ethz.ch mailing list
>https://www.stat.math.ethz.ch/mailman/listinfo/r-help
>PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>
>  
>




More information about the R-help mailing list