Как изменить ширину линии в ggplot?

127

Datalink: используемые данные

Мой код:

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

Мой результат: Result_Figure

Новый результат с aes (size = 2): NewResult-Рис

Мой вопрос: есть ли способ более точно контролировать ширину линии, чтобы избежать результата на втором графике? Я особенно нахожу это недружелюбным к документам, и тем более для целей публикации, включать график с новой определенной шириной линии.

лучше всего, Исмаил

iouraich
источник
9
Чтобы изменить ширину линии, просто добавьте аргумент size = 2 в geom_line ().
Дидзис Эльфертс
3
Просто поэкспериментировал, и похоже, что размер не должен принимать целые значения, как вы используете с 1 и 2. Я только что ввел 1,5 и получил что-то среднее. Я не уверен, что такое фиксированное значение будет работать для вас при любых обстоятельствах, но, по крайней мере, оно кажется настраиваемым.
jxramos

Ответы:

127

Хотя у @Didzis есть правильный ответ , я остановлюсь на нескольких моментах.

Эстетика может быть установлена ​​или отображена в вызове ggplot.

  • Эстетика, определенная в aes (...), отображается на основе данных и создается легенда.

  • Эстетику также можно присвоить единственному значению, определив его вне aes ().

Насколько я могу судить, вы хотите установить размер как одно значение, а не отображать в вызовеaes()

Когда вы вызываете, aes(size = 2)он создает переменную с именем `2`и использует ее для создания размера, сопоставляя его с постоянным значением, как в вызове кaes (таким образом, оно появляется в вашей легенде).

Использование size = 1 (и без reg_labellerкоторого, возможно, определено где-то в вашем скрипте)

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

введите описание изображения здесь

и с размером = 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'))

введите описание изображения здесь

Теперь вы можете определить размер, чтобы он соответствовал конечному размеру изображения и типу устройства.

mnel
источник
72

Ширина строки в ggplot2может быть изменена с помощью аргумента size=в geom_line().

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

введите описание изображения здесь

Дидзис Эльфертс
источник
2
Я уже пробовал ваш вариант, но проблема в том, что линия стала слишком толстой, чтобы ее можно было считать удобной для документа. При использовании aes (размер) я получаю второй график, который я добавил. Я хочу иметь возможность контролировать ширину более систематическим образом, чтобы выбрать наиболее подходящий вариант.
iouraich
8
@ smailov83, не указывайте размер в вызове aes. См. Мой ответ (или ggplot2объяснение в книге.
mnel
6
Значение по умолчанию кажется меньше, чем size=1, возможно 0.5, поэтому, size=1на мой взгляд , использование дает неплохие результаты. Можно также использовать десятичные числа для точной настройки ширины (скажем size=1.2).
Ricardo
5

Ширина строки в ggplot2может быть изменена с помощью аргумента lwd=в geom_line().

geom_line(aes(x=..., y=..., color=...), lwd=1.5)
Marcin G
источник
3

Если вы хотите гибко изменять ширину линии, вы можете использовать «scale_size_manual», это та же процедура для выбора цвета, заливки, альфа-канала и т. Д.

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

Также похоже, что если вы просто поместите sizeаргумент в geom_line()часть, но без aes()него, он будет соответствующим образом масштабироваться. По крайней мере, так работает, geom_densityи у меня была такая же проблема.

Майкл Исон
источник