Variable-Dependent Manipulation of Point and Line Sizes in R

Variable-Dependent Manipulation of Point and Line Sizes in R


I will randomly create a piece of data and then proceed to plot a line graph with points for this data.

Genotype= rep(c("GenotypeA","GenotypeB"),each=6)
Nitrogen= rep(c(0,20,50,100,150,200),2)
Yield= c(25,27,26,27,30,35,10,12,14,16,18,20)
dataA= data.frame(Genotype,Nitrogen,Yield)

    Genotype Nitrogen Yield
1  GenotypeA        0    25
2  GenotypeA       20    27
3  GenotypeA       50    26
4  GenotypeA      100    27
5  GenotypeA      150    30
6  GenotypeA      200    35
7  GenotypeB        0    10
8  GenotypeB       20    12
9  GenotypeB       50    14
10 GenotypeB      100    16
11 GenotypeB      150    18
12 GenotypeB      200    20

library(ggplot2)
ggplot(data=dataA, aes(x=Nitrogen, y=Yield, fill=Genotype, shape=Genotype))+
  geom_line(size=1, linetype="dashed") +
  geom_point(size=5) +
  scale_shape_manual(values= c(21,22)) +
  scale_fill_manual(values= c("White", "Orange")) +
  scale_x_continuous(breaks = seq(0,200,50),limits = c(0,200)) +
  scale_y_continuous(breaks = seq(0,40,5),limits = c(0,40)) +
  labs(x="Nitrogen", y="Yield") +
  theme_classic(base_size=18, base_family="serif")+
  theme(legend.position='bottom',
        legend.title=element_blank(),
        legend.key=element_rect(color="white", fill="white"),
        legend.text=element_text(family="serif", face="plain",
                                 size=15, color= "Black"),
        legend.background=element_rect(fill="white"),
        axis.line=element_line(linewidth=0.5, colour="black")) +
windows(width=5.5, height=5)

I have differentiated point colors and shapes based on the variable “Genotype”. In the above code, the value geom_point(size=5) sets the point size to 5 for both GenotypeA and GenotypeB. However, I would like to increase the point size specifically for GenotypeA.

library(ggplot2)
ggplot(data=dataA, aes(x=Nitrogen, y=Yield, fill=Genotype, shape=Genotype))+
  geom_line(size=1, linetype="dashed") +
  geom_point(aes(size=Genotype)) +
  scale_shape_manual(values= c(21,22)) +
  scale_fill_manual(values= c("White", "Orange")) +
  scale_size_manual(values=c(9,6))+
  scale_x_continuous(breaks = seq(0,200,50),limits = c(0,200)) +
  scale_y_continuous(breaks = seq(0,40,5),limits = c(0,40)) +
  labs(x="Nitrogen", y="Yield") +
  theme_classic(base_size=18, base_family="serif")+
  theme(legend.position='bottom',
        legend.title=element_blank(),
        legend.key=element_rect(color="white", fill="white"),
        legend.text=element_text(family="serif", face="plain",
                                 size=15, color= "Black"),
        legend.background=element_rect(fill="white"),
        axis.line=element_line(linewidth=0.5, colour="black")) +
windows(width=5.5, height=5)

I will change the code from geom_point(size=5) to geom_point(aes(size=Genotype)). This means that I will adjust the point size based on the variable “Genotype”. Additionally, I will use scale_size_manual(values=c(9,6)) to set the point size differently. Specifically, I will set the point size for GenotypeA to 9 and for GenotypeB to 6.



Now, I would like to adjust the lines. Since the code geom_line(size=1, linetype="dashed") was provided, both GenotypeA and GenotypeB currently have a line size of 1 and a dashed line type. I would like to set a solid blue line for GenotypeA and a red dashed line for GenotypeB.

library(ggplot2)
ggplot(data=dataA, aes(x=Nitrogen, y=Yield, fill=Genotype, shape=Genotype))+
  geom_line(aes(linetype= Genotype, color=Genotype), size=1) +
  geom_point(aes(size=Genotype)) +
  scale_shape_manual(values= c(21,22)) +
  scale_fill_manual(values= c("White", "Orange")) +
  scale_size_manual(values=c(9,6))+
  scale_color_manual(values=c("Blue","Red"))+
  scale_linetype_manual(values=c("solid","dashed")) +
  scale_x_continuous(breaks = seq(0,200,50),limits = c(0,200)) +
  scale_y_continuous(breaks = seq(0,40,5),limits = c(0,40)) +
  labs(x="Nitrogen", y="Yield") +
  theme_classic(base_size=18, base_family="serif")+
  theme(legend.position='bottom',
        legend.title=element_blank(),
        legend.key=element_rect(color="white", fill="white"),
        legend.text=element_text(family="serif", face="plain",
                                 size=15, color= "Black"),
        legend.background=element_rect(fill="white"),
        axis.line=element_line(linewidth=0.5, colour="black")) +
windows(width=5.5, height=5)

I will update the code from geom_line(size=1, linetype="dashed") to geom_line(aes(linetype=Genotype, color=Genotype), size=1). Now that I’ve added aes() with linetype and color set to Genotype, I can configure linetypes and colors based on the different Genotypes. I will utilize scale_color_manual() and scale_linetype_manual() for this purpose.

If you want to specify line sizes separately, you can include size within aes() in the geom_line. It would look like geom_line(aes(linetype=Genotype, color=Genotype, size=Genotype)). However, this approach brings about an issue: the scale_size_manual(values=c(9,6)) code you used to set point sizes will also affect line sizes in the same way.

library(ggplot2)
ggplot(data=dataA, aes(x=Nitrogen, y=Yield, fill=Genotype, shape=Genotype))+
  geom_line(aes(linetype= Genotype, color=Genotype, size=Genotype)) +
  geom_point(aes(size=Genotype)) +
  scale_shape_manual(values= c(21,22)) +
  scale_fill_manual(values= c("White", "Orange")) +
  scale_size_manual(values=c(9,6))+
  scale_color_manual(values=c("Blue","Red"))+
  scale_linetype_manual(values=c("solid","dashed")) +
  scale_x_continuous(breaks = seq(0,200,50),limits = c(0,200)) +
  scale_y_continuous(breaks = seq(0,40,5),limits = c(0,40)) +
  labs(x="Nitrogen", y="Yield") +
  theme_classic(base_size=18, base_family="serif")+
  theme(legend.position='bottom',
        legend.title=element_blank(),
        legend.key=element_rect(color="white", fill="white"),
        legend.text=element_text(family="serif", face="plain",
                                 size=15, color= "Black"),
        legend.background=element_rect(fill="white"),
        axis.line=element_line(linewidth=0.5, colour="black")) +
windows(width=5.5, height=5)

Indeed, if you want to maintain a consistent line size and differentiate it from point sizes, it’s more convenient to keep the line size specification outside of the aes(). However, if it’s necessary to create variations in line sizes based on the variable, I would need to find the relevant code.


Leave a Reply

If you include a website address in the comment section, I cannot see your comment as it will be automatically deleted and will not be posted. Please refrain from including website addresses.