How to plot variables in ggplot2 based on color by value
0
1
Entering edit mode
4.9 years ago

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 • 7.9k views
ADD COMMENT
2
Entering edit mode

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))
ADD REPLY
0
Entering edit mode

@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)

ADD REPLY
1
Entering edit mode

try this:

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

Login before adding your answer.

Traffic: 1885 users visited in the last hour
Help About
FAQ
Access RSS
API
Stats

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.

Powered by the version 2.3.6