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

G.Maubach at weinwolf.de G.Maubach at weinwolf.de
Tue Apr 11 14:03:18 CEST 2017


Hi David,

many thanks for your answer.

I followed your suggesting and came up with the following code:

-- cut --

ggplot(
  d_result,
  aes(x = variable, y = n, fill = 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: Some Text")) +
  labs(fill = "Rating") +
  scale_x_discrete(
    name = element_blank(),
    drop = FALSE) +  # keep factor levels if no value exists
  geom_text(
    aes(label = n),
    color = "white",
    position = position_stack(vjust = 0.5)) +
  theme_minimal() +
  theme(
    legend.position = "right") +
  guides(fill = guide_legend(reverse = TRUE))

-- cut --

In addition to your suggestion I changed "fill = rev(factor(value))" to 
"fill = value" and I added

guides(fill = guide_legend(reverse = TRUE))

to get the legend in the order from 1 .. 6 instead of 6 .. 1.

In my data I added the counts (n) before the mean value in the labels of 
the left hand side. Now it looks to me as a version conforming to the 
ESOMAR and BVM standards.

Many thanks again for your help.

Kind regards

Georg




Von:    David Winsemius <dwinsemius at comcast.net>
An:     G.Maubach at weinwolf.de, 
Kopie:  r-help at r-project.org
Datum:  10.04.2017 22:21
Betreff:        Re: [R] Antwort: Re: Antwort: Re: Way to Plot Multiple 
Variables and Change Color




> On Apr 10, 2017, at 1:06 PM, David Winsemius <dwinsemius at comcast.net> 
wrote:
> 
> 
>> 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.

I edited the code above to take out the inadvertent linefeeds (which got 
inserted by some part of the mail-processing chain) and then ran the 
ggplot call inside pdf() and print(...):
[Anhang "Rplots.pdf" gelöscht von Georg Maubach/WWBO/WW/HAW] 


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
> 
> ______________________________________________
> 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