Como alterar a largura da linha no ggplot?


127

Datalink: os dados utilizados

Meu código:

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

Meu resultado: Result_Figure

Novo resultado com aes (tamanho = 2): NewResult-Figure

Minha pergunta: existe uma maneira de controlar a largura da linha com mais precisão para evitar o resultado no segundo gráfico? Acho particularmente não amigável para documentos e, principalmente, para fins de publicação, para incluir o gráfico com a largura de linha recém-definida.

melhor, ismail


9
Para alterar a largura da linha, basta adicionar o tamanho do argumento = 2 a geom_line ().
Didzis Elferts

3
Acabei de fazer algumas experiências e parece que o tamanho não precisa assumir valores integrais, como você está usando com 1 e 2. Acabei de inserir 1,5 e obtive algo intermediário. Não tenho certeza se um valor fixo como esse funcionaria para você em todas as circunstâncias, mas pelo menos parece sintonizável.
jxramos

Respostas:


127

Enquanto @Didzis tem a resposta correta , vou expandir alguns pontos

A estética pode ser configurada ou mapeada dentro de uma chamada ggplot.

  • Uma estética definida dentro de aes (...) é mapeada a partir dos dados e uma legenda é criada.

  • Uma estética também pode ser configurada para um único valor, definindo-a fora de aes ().

Tanto quanto posso dizer, o que você deseja é definir tamanho para um único valor, não mapear dentro da chamada paraaes()

Quando você chama, aes(size = 2)ela cria uma variável chamada `2`e a usa para criar o tamanho, mapeando-a de um valor constante como dentro de uma chamada para aes(assim, ela aparece na sua legenda).

Usando size = 1 (e sem o reg_labellerqual talvez seja definido em algum lugar do seu script)

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

insira a descrição da imagem aqui

e com tamanho = 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'))

insira a descrição da imagem aqui

Agora você pode definir o tamanho para funcionar adequadamente com o tamanho final da imagem e o tipo de dispositivo.


71

A largura da linha em ggplot2pode ser alterada com o argumento size=em geom_line().

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

insira a descrição da imagem aqui


2
Eu já tentei sua opção, mas o problema é que a linha fica muito grossa para ser considerada compatível com documentos. Ao usar o aes (tamanho), recebo o segundo gráfico que adicionei. Quero poder controlar a largura de uma maneira mais sistemática, a fim de escolher o melhor ajuste.
iouraich

8
@ smailov83, não coloque tamanho dentro da chamada para aes. Veja a minha resposta (ou o ggplot2livro para uma explicação.
mnel

6
O valor padrão parece ser menor do que size=1, talvez 0.5, portanto, o uso size=1gera bons resultados na minha opinião. Pode-se também usar números decimais para ajustar a largura (digamos size=1.2).
Ricardo

5

A largura da linha em ggplot2pode ser alterada com o argumento lwd=em geom_line().

geom_line(aes(x=..., y=..., color=...), lwd=1.5)

3

Se você deseja modificar a largura da linha de maneira flexível, pode usar "scale_size_manual", este é o mesmo procedimento para escolher a cor, preenchimento, alfa, etc.

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

3

Também parece que você acabou de colocar o sizeargumento na geom_line()parte, mas sem aes()ele, ele será dimensionado adequadamente. Pelo menos funciona dessa maneira geom_densitye eu tive o mesmo problema.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.