เพิ่มคำอธิบายแผนภูมิลงในพล็อตบรรทัด ggplot2


143

ฉันมีคำถามเกี่ยวกับตำนานใน ggplot2 ฉันจัดการเพื่อพล็อตสามบรรทัดในกราฟเดียวกันและต้องการเพิ่มคำอธิบายแผนภูมิด้วยสามสีที่ใช้ นี่คือรหัสที่ใช้

library(ggplot2)    
require(RCurl)

link<-getURL("https://dl.dropbox.com/s/ds5zp9jonznpuwb/dat.txt")
datos<- read.csv(textConnection(link),header=TRUE,sep=";")
datos$fecha <- as.POSIXct(datos[,1], format="%d/%m/%Y")    

temp = ggplot(data=datos,aes(x=fecha, y=TempMax,colour="1")) + 
           geom_line(colour="red") + opts(title="TITULO") +
           ylab("Temperatura (C)") + xlab(" ") + 
           scale_y_continuous(limits = c(-10,40)) + 
           geom_line(aes(x=fecha, y=TempMedia,colour="2"),colour="green") + 
           geom_line(aes(x=fecha, y=TempMin,colour="2"),colour="blue") +
           scale_colour_manual(values=c("red","green","blue"))

temp

และเอาท์พุท

ggplot สามบรรทัด

ฉันต้องการเพิ่มคำอธิบายภาพโดยใช้สามสีและชื่อของตัวแปร (TempMax, TempMedia และ TempMin) ฉันเหนื่อย

scale_colour_manual

แต่ไม่สามารถหาวิธีที่แน่นอน

น่าเสียดายที่ข้อมูลดั้งเดิมถูกลบออกจากไซต์ที่เชื่อมโยงและไม่สามารถกู้คืนได้ แต่มาจากไฟล์ข้อมูล meteo ด้วยรูปแบบนี้

"date","Tmax","Tmin","Tmed","Precip.diaria","Wmax","Wmed"
2000-07-31 00:00:00,-1.7,-1.7,-1.7,-99.9,20.4,20.4
2000-08-01 00:00:00,22.9,19,21.11,-99.9,6.3,2.83
2000-08-03 00:00:00,24.8,12.3,19.23,-99.9,6.8,3.87
2000-08-04 00:00:00,20.3,9.4,14.4,-99.9,8.3,5.29
2000-08-08 00:00:00,25.7,14.4,19.5,-99.9,7.9,3.22
2000-08-09 00:00:00,29.8,16.2,22.14,-99.9,8.5,3.27
2000-08-10 00:00:00,30,17.8,23.5,-99.9,7.7,3.61
2000-08-11 00:00:00,27.5,17,22.68,-99.9,8.8,3.85
2000-08-12 00:00:00,24,13.3,17.32,-99.9,8.4,3.49

ฉันยังคงอยากรู้อยากเห็นตำนาน wether สามารถเชื่อมโยงกับองค์ประกอบแยกของพล็อต (เช่น geom_line ที่แตกต่างกัน)
Etienne Low-Décarie

หากคุณมี 3 บรรทัดฉันขอแนะนำให้ดูแพ็คเกจ dirrectlabels (LINK)
Tyler Rinker

@TylerRinker ฉันเคยใช้มาก่อนเพื่อจุดประสงค์อื่น แต่ตอนนี้คำตอบจาก csgillespie ใช้งานได้ดีขึ้นสำหรับฉัน
pacomet

@ EtienneLow-Décarieคุณทำได้ แต่โดยทั่วไปก็ต่อเมื่อพวกเขาใช้สุนทรียภาพที่แตกต่างกัน เช่นการจับคู่หนึ่งชุดของบรรทัดกับสีและอีกชุดหนึ่งกับ linetype โดยทั่วไปคุณจะต้องส่งข้อมูลแยกต่างหากไปยังแต่ละ geom และในกรณีนั้น
joran

คำตอบ:


82

ฉันมักจะพบว่าถ้าฉันระบุสีของแต่ละบุคคลในหลาย geom ของฉันจะทำผิด นี่คือวิธีที่ฉันจะลงจุดข้อมูลของคุณ:

##Subset the necessary columns
dd_sub = datos[,c(20, 2,3,5)]
##Then rearrange your data frame
library(reshape2)
dd = melt(dd_sub, id=c("fecha"))

สิ่งที่เหลืออยู่คือคำสั่ง ggplot อย่างง่าย:

ggplot(dd) + geom_line(aes(x=fecha, y=value, colour=variable)) +
  scale_colour_manual(values=c("red","green","blue"))

พล็อตตัวอย่าง

ป้อนคำอธิบายรูปภาพที่นี่


87
ฉันยังสงสัยเกี่ยวกับวิธีเพิ่มตำนานที่เกี่ยวข้องกับการเพิ่มองค์ประกอบแยกต่างหากเช่น geom_line ซึ่งฉันคิดว่าเป็นจุดประสงค์ดั้งเดิมของคำถาม
Etienne Low-Décarie

202

เนื่องจาก@Etienneถามว่าจะทำอย่างไรโดยไม่ละลายข้อมูล (ซึ่งโดยทั่วไปเป็นวิธีที่ต้องการ แต่ฉันรู้ว่าอาจมีบางกรณีที่ไม่สามารถทำได้) ฉันจึงเสนอทางเลือกต่อไปนี้

เริ่มต้นด้วยชุดย่อยของข้อมูลต้นฉบับ:

datos <-
structure(list(fecha = structure(c(1317452400, 1317538800, 1317625200, 
1317711600, 1317798000, 1317884400, 1317970800, 1318057200, 1318143600, 
1318230000, 1318316400, 1318402800, 1318489200, 1318575600, 1318662000, 
1318748400, 1318834800, 1318921200, 1319007600, 1319094000), class = c("POSIXct", 
"POSIXt"), tzone = ""), TempMax = c(26.58, 27.78, 27.9, 27.44, 
30.9, 30.44, 27.57, 25.71, 25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 
26.58, 26.18, 25.19, 24.19, 27.65, 23.92), TempMedia = c(22.88, 
22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52, 19.71, 20.73, 
23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 20.45, 19.42, 19.97, 
19.61), TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 
16.88, 16.82, 14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 
16.95, 17.55, 15.21, 14.22, 16.42)), .Names = c("fecha", "TempMax", 
"TempMedia", "TempMin"), row.names = c(NA, 20L), class = "data.frame")

คุณสามารถรับเอฟเฟกต์ที่ต้องการได้ด้วย (และนี่จะเป็นการล้างรหัสการพล็อตต้นฉบับด้วย)

ggplot(data = datos, aes(x = fecha)) +
  geom_line(aes(y = TempMax, colour = "TempMax")) +
  geom_line(aes(y = TempMedia, colour = "TempMedia")) +
  geom_line(aes(y = TempMin, colour = "TempMin")) +
  scale_colour_manual("", 
                      breaks = c("TempMax", "TempMedia", "TempMin"),
                      values = c("red", "green", "blue")) +
  xlab(" ") +
  scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
  labs(title="TITULO")

แนวคิดก็คือแต่ละเส้นจะให้สีโดยการจับคู่colourความสวยงามกับสตริงคงที่ การเลือกสตริงซึ่งเป็นสิ่งที่คุณต้องการให้ปรากฏในคำอธิบายแผนภูมินั้นเป็นวิธีที่ง่ายที่สุด ความจริงที่ว่าในกรณีนี้มันเหมือนกับชื่อของyตัวแปรที่ถูกพล็อตไม่สำคัญ มันอาจเป็นชุดของสตริงใด ๆ มันสำคัญมากที่สิ่งนี้อยู่ในaesสาย คุณกำลังสร้างการแมปกับ "ตัวแปร" นี้

scale_colour_manualตอนนี้สามารถแมปสตริงเหล่านี้กับสีที่เหมาะสม ผลที่ได้คือ ป้อนคำอธิบายรูปภาพที่นี่

ในบางกรณีการแมประหว่างระดับและสีจะต้องชัดเจนโดยการตั้งชื่อค่าในสเกลด้วยตนเอง (ขอบคุณ@DaveRGPสำหรับการชี้สิ่งนี้):

ggplot(data = datos, aes(x = fecha)) +
  geom_line(aes(y = TempMax, colour = "TempMax")) +
  geom_line(aes(y = TempMedia, colour = "TempMedia")) +
  geom_line(aes(y = TempMin, colour = "TempMin")) +
  scale_colour_manual("", 
                      values = c("TempMedia"="green", "TempMax"="red", 
                                 "TempMin"="blue")) +
  xlab(" ") +
  scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
  labs(title="TITULO")

(ให้ตัวเลขเหมือนก่อนหน้านี้) ด้วยค่าที่ระบุชื่อการแบ่งสามารถใช้เพื่อกำหนดลำดับในคำอธิบายแผนภูมิและคำสั่งใด ๆ สามารถใช้ในค่าได้

ggplot(data = datos, aes(x = fecha)) +
  geom_line(aes(y = TempMax, colour = "TempMax")) +
  geom_line(aes(y = TempMedia, colour = "TempMedia")) +
  geom_line(aes(y = TempMin, colour = "TempMin")) +
  scale_colour_manual("", 
                      breaks = c("TempMedia", "TempMax", "TempMin"),
                      values = c("TempMedia"="green", "TempMax"="red", 
                                 "TempMin"="blue")) +
  xlab(" ") +
  scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
  labs(title="TITULO")


2
ฉันชอบวิธีนี้ แต่ฉันคิดว่าอาจมีข้อ จำกัด มีปัญหาการเรียงลำดับตามตัวอักษรระหว่างการแมปของตัวแปร 'ตัวแบ่ง' และ 'ค่า' หรือไม่? TempM {a] x, TempM {e} dia และ TempM {i} n เรียงลำดับอย่างเป็นระเบียบแม้ว่าเมื่อฉันปรับให้เข้ากับชื่อตัวแปรของฉันสีดูเหมือนจะจับคู่กันตามลำดับตัวอักษรกับ 'ตัวแบ่ง' ไม่ใช่การป้อนคำสั่ง . สามารถชี้แจง / กลั่นกรองข้างต้นเพื่อสะท้อน / แก้ไขได้หรือไม่?
DaveRGP

3
ฉันจัดการเพื่อค้นหาการแก้ไขปัญหาที่ฉันซื้อไปก่อนหน้านี้อีกครั้ง: การสั่งซื้อสี ใช้แบบฟอร์มscale_colour_manual("", values = c("TempMax" = "red", "TempMedia" = "green", "TempMin" = "blue"))ที่ระบุ TempMax, TempMedia และ TempMin เป็นอาร์กิวเมนต์สีตามคำตอบข้างต้น
DaveRGP

@DaveRGP มันถือเป็นข้อผิดพลาดของ ggplot หรือไม่?
Alessandro Jacopson

1
@StellaBiderman ขอบคุณ ดีใจที่รู้ว่าคำตอบนี้ยังมีประโยชน์ (เกือบ) 5 ปี (!) ในภายหลัง
Brian Diggs

1
@BrianDiggs คุณจะไม่ทราบวิธีการทำให้การแสดงนี้เป็นจุดในระดับที่แตกต่างจากบรรทัดที่คุณจะ?
Stella Biderman

2

ฉันชอบโซลูชันที่เสนอโดย @Brian Diggs อย่างไรก็ตามในกรณีของฉันฉันสร้างแปลงเส้นเป็นวนวนแทนที่จะให้พวกเขาอย่างชัดเจนเพราะฉันไม่รู้จัก apriori ว่าฉันจะมีหลายแปลง เมื่อฉันพยายามปรับรหัสของ @ Brian ฉันประสบปัญหาบางอย่างกับการจัดการสีอย่างถูกต้อง ปรากฎว่าฉันต้องปรับเปลี่ยนฟังก์ชั่นความงาม ในกรณีที่บางคนมีปัญหาเดียวกันนี่คือรหัสที่เหมาะกับฉัน

ฉันใช้ data frame เดียวกับ @Brian:

data <- structure(list(month = structure(c(1317452400, 1317538800, 1317625200, 1317711600, 
                                       1317798000, 1317884400, 1317970800, 1318057200, 
                                       1318143600, 1318230000, 1318316400, 1318402800, 
                                       1318489200, 1318575600, 1318662000, 1318748400, 
                                       1318834800, 1318921200, 1319007600, 1319094000), 
                                     class = c("POSIXct", "POSIXt"), tzone = ""),
                   TempMax = c(26.58, 27.78, 27.9, 27.44, 30.9, 30.44, 27.57, 25.71, 
                               25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 26.58, 26.18, 
                               25.19, 24.19, 27.65, 23.92), 
                   TempMed = c(22.88, 22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52,
                                 19.71, 20.73, 23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 
                                 20.45, 19.42, 19.97, 19.61), 
                   TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 16.88, 16.82, 
                               14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 16.95, 
                               17.55, 15.21, 14.22, 16.42)), 
              .Names = c("month", "TempMax", "TempMed", "TempMin"), 
              row.names = c(NA, 20L), class = "data.frame")  

ในกรณีของฉันฉันสร้างmy.colsและmy.namesแบบไดนามิก แต่ฉันไม่ต้องการทำสิ่งที่ซับซ้อนโดยไม่จำเป็นดังนั้นฉันให้พวกเขาอย่างชัดเจนที่นี่ สามบรรทัดนี้ทำให้การเรียงลำดับของคำอธิบายภาพและการกำหนดสีง่ายขึ้น

my.cols <- heat.colors(3, alpha=1)
my.names <- c("TempMin", "TempMed", "TempMax")
names(my.cols) <- my.names

และนี่คือพล็อต:

p <-  ggplot(data, aes(x = month))

for (i in 1:3){
  p <- p + geom_line(aes_(y = as.name(names(data[i+1])), colour = 
colnames(data[i+1])))#as.character(my.names[i])))
}
p + scale_colour_manual("", 
                        breaks = as.character(my.names),
                        values = my.cols)
p

ป้อนคำอธิบายรูปภาพที่นี่


2
ที่ความซับซ้อนนี้มันจะกลายเป็นเรื่องง่ายมากที่จะเพียงแค่เปลี่ยนรูปร่างข้อมูลของคุณในรูปแบบยาวที่ggplotคาดหวัง
Axeman

1
ฉันไม่คิดว่ามันจะเพิ่มความซับซ้อนเมื่อเปรียบเทียบกับคำตอบเดิมที่โพสต์โดย @Brian นอกจากนี้บางคนอาจต้องการที่จะทำโดยไม่ต้องปรับแต่งข้อมูล
Justyna

... และวิธีการนี้จะช่วยให้ geoms ที่แตกต่างกัน (ประเภทพล็อต) โดยตัวแปร
แม็ค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.