[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