[R] Antwort: Re: Antwort: Re: Way to Plot Multiple Variables and Change Color

David Winsemius dwinsemius at comcast.net
Mon Apr 10 22:06:11 CEST 2017


> On Apr 10, 2017, at 7:45 AM, G.Maubach at weinwolf.de wrote:
> 
> Hi Ulrik,
> 
> many thanks for your reply. I had to take an unplanned break and was not 
> in the office during the last two weeks. Thus my late reply.
> 
> I followed your advice and converted the variable in argument "fill" to 
> factor. Now the color change works:
> 
> -- cut --
> 
> d_result <- structure(list("variable" = c("Item 1 (ø = 3.3) ", "Item 1 (ø 
> = 3.3) ",
>                                        "Item 1 (ø = 3.3) ", "Item 1 (ø = 
> 3.3) ", "Item 1 (ø = 3.3) ",
>                                        "Item 1 (ø = 3.3) ", "Item 2 (ø = 
> 3.8) ", "Item 2 (ø = 3.8) ",
>                                        "Item 2 (ø = 3.8) ", "Item 2 (ø = 
> 3.8) ", "Item 2 (ø = 3.8) ",
>                                        "Item 2 (ø = 3.8) ", "Item 3 (ø = 
> 3.4) ", "Item 3 (ø = 3.4) ",
>                                        "Item 3 (ø = 3.4) ", "Item 3 (ø = 
> 3.4) ", "Item 3 (ø = 3.4) ",
>                                        "Item 3 (ø = 3.4) ", "Item 4 (ø = 
> 3.4) ", "Item 4 (ø = 3.4) ",
>                                        "Item 4 (ø = 3.4) ", "Item 4 (ø = 
> 3.4) ", "Item 4 (ø = 3.4) ",
>                                        "Item 4 (ø = 3.4) ", "Item 5 (ø = 
> 3.5) ", "Item 5 (ø = 3.5) ",
>                                        "Item 5 (ø = 3.5) ", "Item 5 (ø = 
> 3.5) ", "Item 5 (ø = 3.5) ",
>                                        "Item 5 (ø = 3.5) ", "Item 6 (ø = 
> 3.5) ", "Item 6 (ø = 3.5) ",
>                                        "Item 6 (ø = 3.5) ", "Item 6 (ø = 
> 3.5) ", "Item 6 (ø = 3.5) ",
>                                        "Item 6 (ø = 3.5) ", "Item 7 (ø = 
> 3.4) ", "Item 7 (ø = 3.4) ",
>                                        "Item 7 (ø = 3.4) ", "Item 7 (ø = 
> 3.4) ", "Item 7 (ø = 3.4) ",
>                                        "Item 7 (ø = 3.4) ", "Item 8 (ø = 
> 3.3) ", "Item 8 (ø = 3.3) ",
>                                        "Item 8 (ø = 3.3) ", "Item 8 (ø = 
> 3.3) ", "Item 8 (ø = 3.3) ",
>                                        "Item 8 (ø = 3.3) "), value = 
> structure(c(1L, 2L, 3L, 4L, 5L,
>        6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L,
>        4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L,
>        2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L), .Label = c("1 = very 
> satisfied",
>                                                                "2", "3", 
> "4", "5", "6 = very dissatified"), class = "factor"),
>                           n = c(14L, 20L, 24L, 14L, 16L, 14L, 9L, 15L, 
> 21L, 20L, 14L,
>                                 23L, 19L, 17L, 16L, 14L, 16L, 20L, 22L, 
> 17L, 15L, 16L, 20L,
>                                 12L, 19L, 15L, 16L, 15L, 18L, 19L, 18L, 
> 15L, 18L, 18L, 16L,
>                                 17L, 17L, 20L, 17L, 17L, 14L, 16L, 16L, 
> 25L, 16L, 17L, 8L,
>                                 20L)), .Names = c("variable", "value", 
> "n"), row.names =
>                        c(NA,
>                          -48L), vars = list("variable"), drop = TRUE, 
> indices =
>                        list(0:5,
>                             6:11, 12:17, 18:23, 24:29, 30:35, 36:41, 
> 42:47),
>                      group_sizes = c(6L,
>                                      6L, 6L, 6L, 6L, 6L, 6L, 6L),
>                      biggest_group_size = 6L,
>                      labels = structure(list(
>                        "variable" = structure(1:8, .Label = c("Item 1 (ø 
> = 3.3) ",
>                                                             "Item 2 (ø = 
> 3.8) ", "Item 3 (ø = 3.4) ", "Item 4 (ø = 3.4) ",
>                                                             "Item 5 (ø = 
> 3.5) ", "Item 6 (ø = 3.5) ", "Item 7 (ø = 3.4) ",
>                                                             "Item 8 (ø = 
> 3.3) "), class = "factor")),
>                        row.names = c(NA,
>                                      -8L), class = "data.frame", vars = 
> list("variable"),
>                        drop = TRUE, .Names = "variable"),
>                      class = c("grouped_df",
>                                "tbl_df", "tbl", "data.frame"))
> 
> ggplot(
>  d_result,
>  aes(x = variable, y = n, fill = rev(factor(value)))) +
>  geom_bar(
>    stat = "identity") +
>  coord_cartesian(ylim = c(0,100)) +
>  coord_flip() +
>  scale_y_continuous(name = "Percent") +
>  scale_fill_manual(
>    values = rev(
>      c(
>        "forestgreen", "limegreen",
>        "gold", "orange1",
>        "tomato3", "darkred"))) +
>  ggtitle(
>    paste(
>      "Question 8: Satisfaction?")) +
>  labs(fill = "Rating") +
>  scale_x_discrete(
>    name = element_blank()) +
>  # scale_color_manual(
>  #   values = rev(
>  #     c(
>  #       "forestgreen", "limegreen",
>  #       "gold", "orange1",
>  #       "tomato3", "darkred"))) +
>  geom_text(
>    aes(label = n),
>    color = "white",
>    position = position_stack(vjust = 0.5)) +
>  theme_minimal() +
>  theme(
>    legend.position = "right")
> 
> -- cut --
> 
> I tried to change the order of the items on the y-axis,  e.g. Item 8 
> should be last and Item 1 first.

"First" and "last" apparently mean "top" and "bottom" to you. Since the $variable column is character, and ordering is typically done by setting levels of factors, try:

d_result$variable <- factor(d_result$variable, levels=rev(unique(d_result$variable)))


# changes ordering so the "Item 1"'s are at the top.


> I tried to reverse the order of the items 
> within ggplot using rev() and relevel(). But neither of them worked. Is 
> there a way to do it?

I don't think you can relevel a character column.
> 
> I also tried to adjust the color palette for the legend, e.g. 1 = very 
> satisfied is green, 6 = very dissatified is red instead of vice versa as 
> it is now. The result should ensure the item naming for 1 = satisfied and 
> 6 = unsatifies cause this is the way it was asked in the questionnaire.
> 
> Thus my question is:
> 
> 1. How can I change the order of the sequence for the y-axis?
> 
> 2. How can I adjust the color palette of the legend that it matches the 
> correct items?

You probably could use relevel sinc `value` was a factor but I found it easier to simply repeat the relevelling code and change the target column name:

d_result$value <- factor(d_result$value, levels=rev(unique(d_result$value)))

I did find the appearance of the final result stange because there was irregular use of "\n" in the "variable" character values. that created more items than I think you wanted to appear.

HTH;
David.
> 
> Can you give me a hint which functions I could use to do it?
> 
> Kind regards
> 
> Georg
> 
> 
> 
> 
> Von:    Ulrik Stervbo <ulrik.stervbo at gmail.com>
> An:     G.Maubach at weinwolf.de, "Richard M. Heiberger" <rmh at temple.edu>, 
> Kopie:  r-help <r-help at r-project.org>
> Datum:  28.03.2017 18:32
> Betreff:        Re: [R] Antwort: Re: Way to Plot Multiple Variables and 
> Change Color
> 
> 
> 
> Hi Georg,
> 
> you were on the right path - it is all about scale_fill*
> 
> The 'problem' as you've discovered is that value is continuous, but 
> applying scale_fill_manual or others (except scale_fill_gradient) expects 
> discrete values.
> 
> The solution is simply to set the fill with that by using factor():
> 
> ggplot(
>  d_result,
>  aes(variable, y = n, fill = factor(value))) +
>  geom_bar(stat = "identity") +
> scale_fill_manual(values = RColorBrewer::brewer.pal(4, "Blues"))
> or: 
> ggplot(
>  d_result,
>  aes(variable, y = n, fill = factor(value))) +
>  geom_bar(stat = "identity") +
>  scale_fill_manual(values = c("red","blue", "green", "purple"))
> 
> When using colorBrewer (which I highly recommend), I use scale_*_brewer 
> rather than setting the colour manually:
> 
> ggplot(
>  d_result,
>  aes(variable, y = n, fill = factor(value))) +
>  geom_bar(stat = "identity") +
>  scale_fill_brewer(palette = "Blues ")
> 
> Best,
> Ulrik
> 
> 
> On Tue, 28 Mar 2017 at 18:21 <G.Maubach at weinwolf.de> wrote:
> Hi Richard,
> 
> many thanks for your reply.
> 
> Your solution is not exactly what I was looking for. I would like to know
> how I can change the colors of the stacked bars in my plot and not use the
> default values. How can this be done?
> 
> Kind regards
> 
> Georg
> 
> 
> 
> 
> Von:    "Richard M. Heiberger" <rmh at temple.edu>
> An:     G.Maubach at weinwolf.de,
> Kopie:  r-help <r-help at r-project.org>
> Datum:  28.03.2017 17:40
> Betreff:        Re: [R] Way to Plot Multiple Variables and Change Color
> 
> 
> 
> I think you are looking for the likert function in the HH package.
>> From ?likert
> 
> 
> Diverging stacked barcharts for Likert, semantic differential, rating
> scale data, and population pyramids.
> 
> 
> This will get you started.  Much more fine control is available.  See
> the examples and demo.
> 
> ## install.packages("HH") ## if not yet on your system.
> 
> library(HH)
> 
> AA <- dfr[,-9]
> 
> labels <- sort(unique(as.vector(data.matrix(AA))))
> result.template <- integer(length(labels))
> names(result.template) <- labels
> 
> BB <- apply(AA, 2, function(x, result=result.template) {
>  tx <- table(x)
>  result[names(tx)] <- tx
>  result
> }
> )
> 
> BB
> 
> likert(t(BB), ReferenceZero=0, horizontal=FALSE)
> 
> 
> On Tue, Mar 28, 2017 at 6:05 AM,  <G.Maubach at weinwolf.de> wrote:
>> Hi All,
>> 
>> in my current project I have to plot a whole bunch of related variables
>> (item batteries, e.g. How do you rate ... a) Accelaration, b) Horse
> Power,
>> c) Color Palette, etc.) which are all rated on a scale from 1 .. 4.
>> 
>> I need to present the results as stacked bar charts where the variables
>> are columns and the percentages of the scales values (1 .. 4) are the
>> chunks of the stacked bar for each variable. To do this I have
> transformed
>> my data from wide to long and calculated the percentage for each
> variable
>> and value. The code for this is as follows:
>> 
>> -- cut --
>> 
>> dfr <- structure(
>>  list(
>>    v07_01 = c(3, 1, 1, 4, 3, 4, 4, 1, 3, 2, 2, 3,
>>               4, 4, 4, 1, 1, 3, 3, 4),
>>    v07_02 = c(1, 2, 1, 1, 2, 1, 4, 1, 1,
>>               4, 4, 1, 4, 4, 1, 3, 2, 3, 3, 1),
>>    v07_03 = c(3, 2, 2, 1, 4, 1,
>>               2, 3, 3, 1, 4, 2, 3, 1, 4, 1, 4, 2, 2, 3),
>>    v07_04 = c(3, 1, 1,
>>               4, 2, 4, 4, 2, 2, 2, 4, 1, 2, 1, 3, 1, 2, 4, 1, 4),
>>    v07_05 = c(1,
>>               2, 2, 2, 4, 4, 1, 1, 4, 4, 2, 1, 2, 1, 4, 1, 2, 4, 1, 4),
>>    v07_06 = c(1,
>>               2, 1, 2, 1, 1, 3, 4, 3, 2, 2, 3, 3, 2, 4, 2, 3, 1, 4, 3),
>>    v07_07 = c(3,
>>               2, 3, 3, 1, 1, 3, 3, 4, 4, 1, 3, 1, 3, 2, 4, 1, 2, 3, 4),
>>    v07_08 = c(3,
>>               2, 1, 2, 2, 2, 3, 3, 4, 4, 1, 1, 1, 2, 3, 1, 4, 2, 2, 4),
>>    cased_id = structure(
>>      1:20,
>>      .Label = c(
>>        "1",
>>        "2",
>>        "3",
>>        "4",
>>        "5",
>>        "6",
>>        "7",
>>        "8",
>>        "9",
>>        "10",
>>        "11",
>>        "12",
>>        "13",
>>        "14",
>>        "15",
>>        "16",
>>        "17",
>>        "18",
>>        "19",
>>        "20"
>>      ),
>>      class = "factor"
>>    )
>>  ),
>>  .Names = c(
>>    "v07_01",
>>    "v07_02",
>>    "v07_03",
>>    "v07_04",
>>    "v07_05",
>>    "v07_06",
>>    "v07_07",
>>    "v07_08",
>>    "cased_id"
>>  ),
>>  row.names = c(NA, -20L),
>>  class = c("tbl_df", "tbl",
>>            "data.frame")
>> )
>> 
>> mdf <- melt(df)
>> d_result <- mdf  %>%
>>  dplyr::group_by(variable) %>%
>>  count(value)
>> 
>> ggplot(
>>  d_result,
>>  aes(variable, y = n, fill = value)) +
>>  geom_bar(stat = "identity") +
>>  coord_cartesian(ylim = c(0,100))
>> 
>> -- cut --
>> 
>> Is there an easier way of doing this, i. e. a way without need to
>> transform the data?
>> 
>> How can I change the colors for the data points 1 .. 4?
>> 
>> I tried
>> 
>> -- cut --
>> 
>>  d_result,
>>  aes(variable, y = n, fill = value)) +
>>  geom_bar(stat = "identity") +
>>  coord_cartesian(ylim = c(0,100)) +
>>  scale_fill_manual(values = RColorBrewer::brewer.pal(4, "Blues"))
>> 
>> -- cut -
>> 
>> but this does not work cause I am mixing continuous and descrete values.
>> 
>> How can I change the colors for the bars?
>> 
>> Kind regards
>> 
>> Georg
>> 
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
> 
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide 
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
> 
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list