Hello,

This seems like a repetition of a question you already asked and it has nothing to do with the fill aesthetic.

The error message is caused by the maps

y = mpg[[y]]
color = mpg[[c]]


First you filter the data keeping only a subset of the rows but now you are using the full data. This causes the error, the sizes of the filtered data and of the full data are not the same.


mpg %>% filter(hwy < 35) %>% dim()
#[1] 226  11

y <- "hwy"
length(mpg[[y]])
#[1] 234


If you pass a string as variable, you must ?get the variable value, like in the first function below, plot1.




plot1 <- function(y, c, f){
  mpg %>%
    filter(hwy <35) %>%
    ggplot(aes(x = displ, y = get(y), color = get(c))) +
    geom_point()
ggsave(paste0("~/tmp/", f ,".jpg"), width = 9, height = 6, dpi = 1200, units = "in")
}
plot1("hwy","cyl","hwy_cyl_f")




Or you can use aes_string. But since the x axis is fixed, not variable, pay attention to not mix a variable (displ) with variables' names (hwy and cyl). So in the next function I use aes() in the initial call to ggplot and aes_string in the geom_point layer.




plot2 <- function(y, c, f){
  mpg %>%
    filter(hwy <35) %>%
    ggplot(aes(x = displ)) +
    geom_point(aes_string(y = y, color = c))
ggsave(paste0("~/tmp/", f ,".jpg"), width = 9, height = 6, dpi = 1200, units = "in")
}
plot2("hwy","cyl","hwy_cyl_f2")



Hope this helps,

Rui Barradas

Às 18:42 de 30/12/21, Kai Yang via R-help escreveu:
Hi R team,
I can create a plot using the code below:
library(ggplot2)
library(dplyr)
mpg %>%
   filter(hwy <35) %>%
   ggplot(aes(x = displ, y = hwy, color = cyl)) +
   geom_point()
ggsave("c:/temp/hwy_cyl.jpg",width = 9, height = 6, dpi = 1200, units = "in")


I want to do the exactly same work using function. Below is the function I 
created:
plot1 <- function(y, c, f){
           mpg %>%
             filter(hwy <35) %>%
             ggplot(aes(x = displ, y = mpg[[y]], color = mpg[[c]] )) +
             geom_point()
           ggsave(paste0("c:/temp/", f ,".jpg"), width = 9, height = 6, dpi = 1200, units 
= "in")
}
plot1("hwy","cyl","hwy_cyl_f")

But I got error message when I run the code: "Aesthetics must be either length 1 or the same 
as the data (226): y and colour" . I checked online about the message. My understanding is: I 
need to add "fill" in geom_point() statement. My questions are:
1. is it possible to make the code work without add 'fill' in geom_point() 
statement, but keep the color as same as the first code?
2. if I must add 'fill' option in geom_point() statement, how to add them in? 
Should I add 266 colors name after 'fill'?
3. this is my first function in R, I'm sure there are many problems in the 
code. please point out my error in the code.


Thank you,
Kai

        [[alternative HTML version deleted]]

______________________________________________
R-help@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@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.

Reply via email to