Jak zmienić szerokość linii w ggplot?

127

Datalink: używane dane

Mój kod:

ccfsisims <- read.csv(file = "F:/Purdue University/RA_Position/PhD_ResearchandDissert/PhD_Draft/GTAP-CGE/GTAP_NewAggDatabase/NewFiles/GTAP_ConsIndex.csv", header=TRUE, sep=",", na.string="NA", dec=".", strip.white=TRUE)
ccfsirsts <- as.data.frame(ccfsisims)
ccfsirsts[6:24] <- sapply(ccfsirsts[6:24],as.numeric)
ccfsirsts <- droplevels(ccfsirsts)
ccfsirsts <- transform(ccfsirsts,sres=factor(sres,levels=unique(sres)))

library(ggplot2)

#------------------------------------------------------------------------------------------
#### Plot of food security index for Morocco and Turkey by sector
#------------------------------------------------------------------------------------------

#_Code_Begin...

datamortur <- melt(ccfsirsts[ccfsirsts$region %in% c("TUR","MAR"), ]) # Selecting regions of interest
datamortur1 <- datamortur[datamortur$variable %in% c("pFSI2"), ] # Selecting the food security index of interest
datamortur2 <- datamortur1[datamortur1$sector %in% c("wht","gro","VegtFrut","osd","OthCrop","VegtOil","XPrFood"), ] # Selecting food sectors of interest
datamortur3 <- subset(datamortur2, tradlib !="BASEDATA") # Eliminating the "BASEDATA" scenario results  

allfsi.f <- datamortur3
fsi.wht <- allfsi.f[allfsi.f$sector %in% c("wht"), ]

Figure29 <- ggplot(data=fsi.wht, aes(x=factor(sres),y=value,colour=factor(tradlib)))
Figure29 + geom_line(aes(group=factor(tradlib),size=2)) + facet_grid(regionsFull~., scales="free_y", labeller=reg_labeller) + scale_colour_brewer(type = "div") +
theme(axis.text.x = element_text(colour = 'black', angle = 90, size = 13, hjust = 0.5, vjust = 0.5),axis.title.x=element_blank()) + 
ylab("FSI (%Change)") + theme(axis.text.y = element_text(colour = 'black', size = 12), axis.title.y = element_text(size = 12, hjust = 0.5, vjust = 0.2)) + 
theme(strip.text.y = element_text(size = 11, hjust = 0.5, vjust = 0.5, face = 'bold'))

Mój wynik: Wynik_Figura

Newresult with aes (size = 2): NewResult-Figure

Moje pytanie: czy istnieje sposób na dokładniejsze kontrolowanie szerokości linii, aby uniknąć wyniku na drugim wykresie? Szczególnie uważam, że jest to nieprzyjazne dla dokumentu, a zwłaszcza do celów publikacyjnych, aby uwzględnić wykres z nowo zdefiniowaną szerokością linii.

najlepiej, ismail

iouraich
źródło
9
Aby zmienić szerokość linii, po prostu dodaj argument size = 2 do geom_line ().
Didzis Elferts
3
Po prostu trochę poeksperymentowałem i wygląda na to, że rozmiar nie musi przyjmować wartości całkowitych, ponieważ używasz z 1 i 2. Właśnie wprowadziłem 1,5 i otrzymałem coś pomiędzy. Nie jestem pewien, czy taka stała wartość zadziała w każdych okolicznościach, ale przynajmniej wydaje się, że można ją dostroić.
jxramos

Odpowiedzi:

127

Chociaż @Didzis ma poprawną odpowiedź , kilka kwestii

Estetykę można ustawić lub odwzorować w wywołaniu ggplot.

  • Estetyka zdefiniowana w aes (...) jest odwzorowywana na podstawie danych i tworzona jest legenda.

  • Estetykę można również przypisać pojedynczej wartości, definiując ją poza aes ().

O ile wiem, chcesz ustawić rozmiar na jedną wartość, a nie mapować w wywołaniuaes()

Kiedy wywołujesz aes(size = 2), tworzy zmienną o nazwie `2`i używa jej do tworzenia rozmiaru, mapując ją ze stałej wartości, tak jak jest w wywołaniu doaes (w ten sposób pojawia się w twojej legendzie).

Używanie size = 1 (i bez reg_labellerktórego jest prawdopodobnie zdefiniowane gdzieś w skrypcie)

Figure29 +
    geom_line(aes(group=factor(tradlib)),size=1) +
    facet_grid(regionsFull~., scales="free_y") +
    scale_colour_brewer(type = "div") +
    theme(axis.text.x = element_text(
          colour = 'black', angle = 90, size = 13,
          hjust = 0.5, vjust = 0.5),axis.title.x=element_blank()) +
    ylab("FSI (%Change)") +
    theme(axis.text.y = element_text(colour = 'black', size = 12), 
          axis.title.y = element_text(size = 12, 
          hjust = 0.5, vjust = 0.2)) + 
    theme(strip.text.y = element_text(size = 11, hjust = 0.5,
          vjust =    0.5, face = 'bold'))

wprowadź opis obrazu tutaj

i przy rozmiarze = 2

 Figure29 + 
     geom_line(aes(group=factor(tradlib)),size=2) +
     facet_grid(regionsFull~., scales="free_y") + 
     scale_colour_brewer(type = "div") +
     theme(axis.text.x = element_text(colour = 'black', angle = 90,
          size = 13, hjust = 0.5, vjust = 
          0.5),axis.title.x=element_blank()) + 
     ylab("FSI (%Change)") +
     theme(axis.text.y = element_text(colour = 'black', size = 12),
          axis.title.y = element_text(size = 12,
          hjust = 0.5, vjust = 0.2)) + 
      theme(strip.text.y = element_text(size = 11, hjust = 0.5,
          vjust = 0.5, face = 'bold'))

wprowadź opis obrazu tutaj

Możesz teraz zdefiniować rozmiar, aby działał odpowiednio z ostatecznym rozmiarem obrazu i typem urządzenia.

mnel
źródło
71

Szerokość linii w ggplot2można zmienić za pomocą argumentu size=w geom_line().

#sample data
df<-data.frame(x=rnorm(100),y=rnorm(100))
ggplot(df,aes(x=x,y=y))+geom_line(size=2)

wprowadź opis obrazu tutaj

Didzis Elferts
źródło
2
Wypróbowałem już twoją opcję, ale problem polega na tym, że linia stała się zbyt gruba, aby można ją było uznać za przyjazną dla dokumentu. Używając aes (rozmiar), otrzymuję drugi wykres, który dodałem. Chcę móc kontrolować szerokość w bardziej systematyczny sposób, aby wybrać najlepsze dopasowanie.
iouraich
8
@ smailov83, nie podawaj rozmiaru w wywołaniu aes. Zobacz moją odpowiedź (lub ggplot2wyjaśnienie w książce
mnel
6
Wartość domyślna wydaje się być mniejsza niż size=1być może 0.5, więc size=1moim zdaniem użycie daje całkiem dobre wyniki. Można również użyć liczb dziesiętnych, aby precyzyjnie dostroić szerokość (powiedzmy size=1.2).
Ricardo
5

Szerokość linii w ggplot2można zmienić za pomocą argumentu lwd=w geom_line().

geom_line(aes(x=..., y=..., color=...), lwd=1.5)
Marcin G.
źródło
3

Jeśli chcesz elastycznie modyfikować szerokość linii, możesz użyć "scale_size_manual", jest to ta sama procedura wybierania koloru, wypełnienia, alfa itp.

library(ggplot2)
library(tidyr)

x = seq(0,10,0.05)

df <- data.frame(A = 2 * x + 10,
                 B = x**2 - x*6,
                 C = 30 - x**1.5,
                 X = x)


df = gather(df,A,B,C,key="Model",value="Y")


ggplot( df, aes (x=X, y=Y, size=Model, colour=Model ))+
  geom_line()+
  scale_size_manual( values = c(4,2,1) ) +
  scale_color_manual( values = c("orange","red","navy") ) 
Juan Chamie
źródło
3

Wygląda również na to, że jeśli po prostu umieścisz sizeargument w geom_line()części, ale bez elementu aes()zostanie on odpowiednio skalowany. Przynajmniej działa w ten sposób z geom_densityi miałem ten sam problem.

Michael Eason
źródło