This is a test version of Biostars. For the public version, visit https://www.biostars.org.
How to plot variables in ggplot2 based on color by value

Hi,

I have a question about plotting variables based on the color by value using the ggplot2 library. There are 3 columns in the data frame (Var1, Var2, and value). Below is the code I am running in R. I keep getting the error message Aesthetics must be either length 1 or the same as the data (27): fill. Please let me know how to resolve this.

Thank you,

Toufiq

Input

mod.group_test <- read.csv(file ="./mod.group_test.csv", stringsAsFactors = F)

dput(mod.group_test)
structure(list(Var1 = structure(c(1L, 6L, 13L, 23L, 24L, 25L, 
26L, 27L, 2L, 3L, 4L, 5L, 7L, 8L, 9L, 10L, 11L, 12L, 14L, 15L, 
16L, 17L, 18L, 19L, 20L, 21L, 22L), .Label = c("A1", "A15", "A16", 
"A17", "A18", "A2", "A24", "A25", "A26", "A27", "A28", "A29", 
"A3", "A30", "A31", "A32", "A33", "A34", "A35", "A36", "A37", 
"A38", "A4", "A5", "A6", "A7", "A8"), class = "factor"), Var2 = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), value = c(-0.584795322, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.461538462, 0, 0, 
0, 0, 0, 0.5859375, 0, 0.732600733, -4.545454545, 0, 0)), row.names = c(NA, 
-27L), class = "data.frame")

class(mod.group_test)
[1] "data.frame"

mod.group_test$Var1 <- as.factor(mod.group_test$Var1)

str(mod.group_test)
'data.frame':   27 obs. of  3 variables:
 $ Var1 : Factor w/ 27 levels "A1","A15","A16",..: 1 6 13 23 24 25 26 27 2 3 ...
 $ Var2 : int  1 1 1 1 1 1 1 1 1 1 ...
 $ value: num  -0.585 0 0 0 0 ...

dev.new()
png(filename = paste0("Test.png"), res = 600, height = 5.5, width = 8.5, units = "in")
ggplot(mod.group_test, aes(Var1, as.factor(Var2))) +
  geom_tile(color="#E6E6E6" , size = 0.2, fill= color)+
  geom_point(aes(colour=value,size=1))+ 
  theme(axis.text.x = element_text(angle = -90, hjust = 0))+
  labs(title= "Test")+
  ylab("") +
  xlab("") +
  scale_color_gradient2(low = "blue", mid="white", high = "red", limits=c(-100,100),na.value = "#E6E6E6", guide = "colourbar")+
  theme_light() +
  theme(panel.grid.minor = element_line(colour="black", size=0.9))+
  coord_flip() + scale_x_discrete(limits = rev(levels(mod.group_test$Var1))) +
  theme(panel.border = element_rect(color = "black",size = 0.5),
        axis.text.x = element_text(colour="black",size=9,angle=0,hjust=0.5,vjust=2,face="plain"),
        axis.text.y = element_text(colour="black",size=9,angle=0,hjust=0.5,vjust=0.5,face="plain"))

dev.off()


Error: Aesthetics must be either length 1 or the same as the data (27): fill

Expected output: I would like to plot something similar to this based on the values

r ggplot2 geom_point variable dataframe

Most of the data values are zero (median =0) and data has extreme values due to which gradient doesn't work proper. There is unnecessary coordinating flipping and tile option (IMO) in this plot. Gradient range is also incorrect (c(-100,100)). Please start with simplest ggplot2 code and add decorators later on.

Try this with dput data frame:

ggplot(df, aes( as.factor(Var2),Var1)) +
    geom_point(aes(color=value, size=value))+
    scale_color_gradient2(low = "blue", mid = "white",high = "red", midpoint = mean(df$value))

@cpad0112,

Excellent. Thank you very much. However, I observe that on the y-axis the values are ordered in the "Descending order" (for instance, from top to bottom -A8, A7, A6, ................A1). Is there a way I can arrange (A1, A2, A3, A4..........A38)

try this:

library(ggplot2)
library(naturalsort)
ggplot(df, aes(Var2,naturalfactor(Var1)))+
    geom_point(aes(size=value))

0 answers

No answers yet.

Log in to answer this question.