indien anders voorwaarde in ggplot om een ​​extra laag toe te voegen

stel dat ik twee lagen in ggplot wil plotten, een met punten en een andere met lijnen als aan een bepaald criterium wordt voldaan.

De code zonder de criteria zou er als volgt uit kunnen zien:

library("ggplot2")
# Summarise number of movie ratings by year of movie
mry <- do.call(rbind, by(movies, round(movies$rating), function(df) {
  nums <- tapply(df$length, df$year, length)
  data.frame(rating=round(df$rating[1]), year = as.numeric(names(nums)), number=as.vector(nums))
}))
p <- ggplot(mry, aes(x=year, y=number, group=rating))
p + 
geom_point()+
geom_line()

nu zou de voorwaarde voor het plotten van de punten en niet alleen de lijnen zijn, dat een object met de naam tmp.data niet gelijk is aan de uitdrukking “geen waarde”.

tmp.data<-c(1,2,3) # in this case the condition is fulfilled
# attempt to plot the two layers including the condition in the plotting function
p+ 
  if(tmp.data[1]!="no value"){ geom_point()+}
  geom_line()

mislukt….

Error: unexpected '}' in:
"p+ 
if(tmp.data[1]!="no value"){ geom_point()+}"

geom_line()
geom_line:
stat_identity:
position_identity: (breedte = NULL, hoogte = NULL)


Antwoord 1, autoriteit 100%

Dit is gedaan met ggplot2 2.1.0. Ik denk dat je precies kunt doen wat de OP wilde, gewoon door de haakjes te verwisselen zodat ze de hele if-instructie omvatten.

Hier is een voorbeeld waarbij een horizontale lijn wordt toegevoegd, afhankelijk van of SwtichTof Fis. Ten eerste, waar de voorwaarde TRUE

is

library(ggplot2)
df<-data.frame(x=1:10,y=11:20)
Switch=T
ggplot(df,aes(x,y))+
{if(Switch)geom_hline(yintercept=15)}+
  geom_point()

voer hier de afbeeldingsbeschrijving in

Nu hetzelfde, maar de voorwaarde is FALSE

df<-data.frame(x=1:10,y=11:20)
Switch=F
ggplot(df,aes(x,y))+
{if(Switch)geom_hline(yintercept=15)}+
  geom_point()

voer hier de afbeeldingsbeschrijving in


Antwoord 2, autoriteit 65%

Wat u ziet, is een syntaxisfout. De meest robuuste manier die ik kan bedenken is:

tmp.data<-c(1,2,3) 
if(tmp.data[1]!="no value") {
   p = p + geom_point()
}
p + geom_line()

Dus je stelt het object pin een reeks samen en voegt alleen geom_point()toe wanneer de if-statements TRUEopleveren.


Antwoord 3, autoriteit 10%

Volgens het ggplot2-boekkunt u een functie maken die een lijst retourneert . Alle NULL-componenten worden genegeerd.

library(ggplot2)
library(ggplot2movies)
# Summarise number of movie ratings by year of movie
mry <- do.call(rbind, by(movies, round(movies$rating), function(df) {
    nums <- tapply(df$length, df$year, length)
    data.frame(rating=round(df$rating[1]), year = as.numeric(names(nums)), number=as.vector(nums))
}))
# create function to add points conditionally
# If the list contains any NULL elements, they’re ignored. 
my_plot <- function(point = FALSE){
    list(
        geom_line(),
        if (point) 
            geom_point()
    )
}
p <- ggplot(mry, aes(x=year, y=number, group=rating))
p + my_plot()

p + my_plot(point = TRUE)

Gemaakt op 25-02-2020 door het reprex-pakket(v0.3.0)


Antwoord 4, autoriteit 7%

library(ggplot2)
# Summarise number of movie ratings by year of movie
mry <- do.call(rbind, by(movies, round(movies$rating), function(df) {
  nums <- tapply(df$length, df$year, length)
  data.frame(rating=round(df$rating[1]), year = as.numeric(names(nums)), number=as.vector(nums))
}))
tmp.data<-c(1,2,3) # in this case the condition is fulfilled
p <- ggplot(mry, aes(x=year, y=number, group=rating))
# this won't "loop through" the data points but it's what you asked for
if (tmp.data[1]!="no value") {
  p <- p + geom_point() + geom_line()
} else {
  p <- p + geom_line()
}
p

g1

maar misschien lijkt dit meer op wat je echt wilt?

mry$rating <- factor(mry$rating)
p <- ggplot(mry, aes(x=year, y=number, group=rating))
p <- p + geom_line()
p <- p + geom_point(data=mry[!(mry$rating %in% tmp.data),], 
                    aes(x=year, y=number, group=rating, color=rating), size=2)
p <- p + scale_color_brewer()
p

g2

Other episodes