พล็อตกราฟสองกราฟในเนื้อเดียวกันใน R


571

ฉันต้องการลงจุด y1 และ y2 ในพล็อตเดียวกัน

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
plot(x, y1, type = "l", col = "red")
plot(x, y2, type = "l", col = "green")

แต่เมื่อฉันทำเช่นนี้พวกเขาไม่ได้วางแผนในพล็อตเดียวกันด้วยกัน

ใน Matlab สามารถทำได้hold onแต่ไม่มีใครรู้วิธีการทำใน R?


3
?curveตรวจสอบ add=TRUEใช้
isomorphismes

ดูคำถามนี้สำหรับคำตอบ ggplot2 ที่เฉพาะเจาะจงมากขึ้น
Axeman

คำตอบ:


617

lines()หรือpoints()จะเพิ่มลงในกราฟที่มีอยู่ แต่จะไม่สร้างหน้าต่างใหม่ ดังนั้นคุณต้องทำ

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")

10
ทำไมมันไม่ทำงานในตัวอย่างง่ายๆต่อไปนี้ > plot (sin)> lines (cos) ข้อผิดพลาดใน as.double (y): ไม่สามารถบังคับพิมพ์ 'builtin' เป็นเวกเตอร์ประเภท 'double'
Frank

23
มองเห็นได้ง่าย ด้วยพล็อต (บาป) คุณกำลังผ่านฟังก์ชั่นแทนที่จะเป็นข้อมูลจริง พล็อต () จะตรวจจับสิ่งนี้และในทางกลับกันใช้ plot.function () เพื่อพล็อตฟังก์ชั่นของคุณ อย่างไรก็ตามไม่ได้กำหนด Lines.function () ดังนั้นบรรทัด () จึงไม่ทราบว่าต้องทำอย่างไรกับพารามิเตอร์ของฟังก์ชันคลาส บรรทัดสามารถจัดการกับข้อมูลและวัตถุอนุกรมเวลาของคลาส ts ได้
Soumendra

27
@Frank plot(sin); curve(cos, add=TRUE)มันทำเช่นนี้
isomorphismes

2
จะใช้วิธีเดียวกันได้อย่างไรถ้า x ต่างกัน? บอกว่าฉันมี x1 และ y1 สำหรับหนึ่งกราฟและเพิ่มอีกกราฟของ x2 และ y2 ในกราฟเดียวกัน ทั้ง x1 และ x2 มีช่วงเดียวกัน แต่มีค่าต่างกัน
Kavipriya

1
มันเหมือนกันทั้งหมด: lines(x2,y2,...)แทนที่จะlines(x,y2,...)
bnaul

220

คุณยังสามารถใช้parและพล็อตบนกราฟเดียวกัน แต่แกนที่แตกต่างกัน บางสิ่งบางอย่างดังต่อไปนี้:

plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )

หากคุณอ่านรายละเอียดเกี่ยวกับparในRคุณจะสามารถสร้างกราฟที่น่าสนใจจริงๆ หนังสืออีกเล่มที่มองดูคือกราฟิก R ของ Paul Murrel


3
R ของฉันให้ฉันข้อผิดพลาด: ข้อผิดพลาดที่ตราไว้ (รูป (ใหม่ = TRUE)): ไม่สามารถหาฟังก์ชั่น "รูป"
Alessandro Jacopson

5
วิธีการของคุณรักษาระดับที่เหมาะสม (แกน y) สำหรับสองแปลงหรือไม่?
Alessandro Jacopson

1
@uvts_cvs ใช่มันจะรักษากราฟดั้งเดิมใน toto
Sam

10
ปัญหาเกี่ยวกับสิ่งนี้คือมันจะเขียนองค์ประกอบการลงจุดหลายอย่างใหม่ ฉันจะรวมและอีกสองสามคนในครั้งที่สองxlab="", ylab="", ... plot
isomorphismes

118

เมื่อสร้างแผนการหลายชั้นควรพิจารณาggplotแพ็คเกจ ความคิดคือการสร้างวัตถุกราฟิกที่มีความสวยงามขั้นพื้นฐานและเพิ่มขึ้นทีละน้อย

ggplotdata.frameรูปแบบต้องมีข้อมูลที่จะใช้ในการบรรจุ

# Data generation
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x,y1,y2)

โซลูชันพื้นฐาน:

require(ggplot2)

ggplot(df, aes(x)) +                    # basic graphical object
  geom_line(aes(y=y1), colour="red") +  # first layer
  geom_line(aes(y=y2), colour="green")  # second layer

ที่นี่+ operatorใช้เพื่อเพิ่มเลเยอร์พิเศษให้กับวัตถุพื้นฐาน

ด้วยggplotคุณสามารถเข้าถึงวัตถุกราฟิกในทุกขั้นตอนของการวางแผน สมมติว่าการตั้งค่าแบบทีละขั้นตอนปกติมีลักษณะดังนี้:

g <- ggplot(df, aes(x))
g <- g + geom_line(aes(y=y1), colour="red")
g <- g + geom_line(aes(y=y2), colour="green")
g

gสร้างพล็อตและคุณสามารถเห็นได้ในทุกสเตจ ความลุ่มหลงเพิ่มเติมของเนื้อเรื่องจะถูกสร้างขึ้นด้วยวัตถุที่สร้างขึ้น ตัวอย่างเช่นเราสามารถเพิ่มป้ายกำกับสำหรับ axises:

g <- g + ylab("Y") + xlab("X")
g

รอบชิงชนะเลิศgดูเหมือนว่า:

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

อัปเดต (2013-11-08):

ตามที่ระบุไว้ในความคิดเห็นggplotปรัชญาของแนะนำให้ใช้ข้อมูลในรูปแบบยาว คุณสามารถอ้างถึงคำตอบนี้เพื่อดูรหัสที่เกี่ยวข้อง


5
ในฐานะที่แนะนำโดยเฮนริกข้อมูลจริงๆควรจะอยู่ใน "ยาว" รูปแบบggplotจัดการนี้ขึ้นตามธรรมชาติกว่า "กว้าง" รูปแบบที่คุณใช้
krlmlr

1
@Henrik: ไม่ขอบคุณสำหรับคำตอบของคุณตั้งแต่แรก บางทีผู้เขียนของคำตอบนี้สามารถแก้ไขได้เพื่อให้สอดคล้องกับggplotปรัชญาของ ...
krlmlr

1
@krlmlr ฉันพยายามแก้ไขคำตอบของฉันเพื่อให้ตอบคำถามได้ชัดเจนยิ่งขึ้น โปรดแนะนำการอัปเดตเพิ่มเติม ไชโย
Henrik

3
สอนให้ฉันนิยาม x บน ggplot (aes ()) แล้ว y ด้วยตัวมันเองใน geom _ * () ดี!
Dan

41

ฉันคิดว่าคำตอบที่คุณต้องการคือ:

plot(first thing to plot)
plot(second thing to plot,add=TRUE)

25
ดูเหมือนว่ามันจะไม่ทำงาน แต่ก็มี"add" is not a graphical parameterคำเตือนแล้วก็พิมพ์พล็อตที่สองลงบนอันแรก
Waldir Leoncio


ข้อดีอย่างหนึ่งของสิ่งนี้คือมันดูเหมือนว่าจะรักษาแกนและชื่อให้คงที่ วิธีการก่อนหน้านี้บางวิธีทำให้ R วาดเครื่องหมายขีดสองชุดบนแกน y ยกเว้นว่าคุณประสบปัญหาในการระบุตัวเลือกเพิ่มเติม จำเป็นต้องพูดว่าการที่มีเครื่องหมายขีดสองชุดบนแกนอาจทำให้เข้าใจผิดได้
RMurphy

1
พารามิเตอร์ add ทำงานได้กับวิธีการลงจุด แต่ไม่ใช้ฐาน / ค่าเริ่มต้นใน R
cloudscomputes

2
"add" is not a graphical parameterผมได้รับข้อผิดพลาดเดียวกัน ฉัน R R version 3.2.3 (2015-12-10)คือ คุณสามารถใช้par(new=TRUE)คำสั่งระหว่างแปลงเหล่านี้
quepas

29

ใช้matplotฟังก์ชั่น:

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))

ใช้สิ่งนี้หากy1และy2ถูกประเมินที่xจุดเดียวกัน มันปรับขนาดแกน Y ให้พอดีกับที่ใดก็ตามที่ใหญ่กว่า ( y1หรือy2) ซึ่งแตกต่างจากคำตอบอื่น ๆ ที่นี่ที่จะคลิปy2ถ้ามันใหญ่กว่าy1(โซลูชัน ggplot ส่วนใหญ่ไม่เป็นไรกับสิ่งนี้)

อีกทางหนึ่งและหากทั้งสองเส้นไม่มีพิกัด x เท่ากันให้ตั้งค่าขีด จำกัด แกนบนพล็อตแรกและเพิ่ม:

x1  <- seq(-2, 2, 0.05)
x2  <- seq(-3, 3, 0.05)
y1 <- pnorm(x1)
y2 <- pnorm(x2,1,1)

plot(x1,y1,ylim=range(c(y1,y2)),xlim=range(c(x1,x2)), type="l",col="red")
lines(x2,y2,col="green")

ฉันประหลาดใจกับคำถามนี้อายุ 4 ปีและไม่มีใครพูดถึงmatplotหรือx/ylim...


25

TL; DR:คุณต้องการที่จะใช้curve(กับadd=TRUE) linesหรือ


ฉันไม่เห็นด้วยpar(new=TRUE)เพราะนั่นจะเป็นการพิมพ์เครื่องหมายและเครื่องหมายแกนสองครั้ง เช่น

ไซน์และพาราโบลา

plot(sin); par(new=T); plot( function(x) x**2 )การส่งออกของ

ดูสิว่าแกนป้ายแนวตั้งนั้นยุ่งแค่ไหน! ตั้งแต่ช่วงที่มีความแตกต่างที่คุณจะต้องตั้งค่าylim=c(lowest point between the two functions, highest point between the two functions)ซึ่งน้อยง่ายกว่าสิ่งที่ฉันจะแสดงให้คุณ --- และวิธีน้อยง่ายถ้าคุณต้องการที่จะเพิ่มไม่ได้เพียงแค่สองเส้นโค้ง แต่หลายคน


สิ่งที่มักจะสับสนฉันเกี่ยวกับพล็อตคือความแตกต่างระหว่างและcurve (หากคุณจำไม่ได้ว่าสิ่งเหล่านี้เป็นชื่อของคำสั่งการวางแผนที่สำคัญสองคำเพียงแค่ร้อง )lines

นี่คือความแตกต่างใหญ่ระหว่างและcurvelines

curvecurve(sin)พล็อตจะฟังก์ชั่นเช่น linesพล็อตจุดที่มีค่า x และ y เช่น: lines( x=0:10, y=sin(0:10) ).

และนี่คือความแตกต่างเล็กน้อย: curveต้องเรียกด้วยadd=TRUEสิ่งที่คุณพยายามทำในขณะที่linesสมมติว่าคุณกำลังเพิ่มพล็อตที่มีอยู่แล้ว

ID & ไซน์

plot(0:2); curve(sin)นี่เป็นผลมาจากการโทร


methods(plot)เบื้องหลังให้ตรวจสอบ body( plot.function )[[5]]และตรวจสอบ เมื่อคุณเรียกplot(sin)ตัวเลข R ออกที่sinเป็นฟังก์ชั่น (ค่าไม่ y) และใช้วิธีการซึ่งสิ้นสุดการโทรplot.function curveดังนั้นcurveเครื่องมือนี้มีไว้เพื่อจัดการกับฟังก์ชั่น



16

ตามที่อธิบาย @redmode ggplotคุณอาจพล็อตสองสายในอุปกรณ์กราฟิกเดียวกันโดยใช้ ในคำตอบนั้นข้อมูลอยู่ในรูปแบบ 'กว้าง' อย่างไรก็ตามเมื่อใช้งานggplotจะสะดวกที่สุดในการเก็บข้อมูลในกรอบข้อมูลในรูปแบบ 'ยาว' จากนั้นโดยใช้ 'การจัดกลุ่มตัวแปร' ที่แตกต่างกันในaesข้อโต้แย้ง thetics คุณสมบัติของบรรทัดเช่น linetype หรือสีจะแตกต่างกันไปตามตัวแปรการจัดกลุ่มและตำนานที่เกี่ยวข้องจะปรากฏขึ้น

ในกรณีนี้เราสามารถใช้colouraessthetics ซึ่งจับคู่สีของเส้นกับตัวแปรในระดับต่าง ๆ ในชุดข้อมูล (ที่นี่: y1 vs y2) แต่ก่อนอื่นเราต้องละลายข้อมูลจากรูปแบบกว้างถึงยาวโดยใช้ฟังก์ชั่น 'ละลาย' จากreshape2แพ็คเกจ วิธีการอื่น ๆ ที่จะช่วยพัฒนาข้อมูลอธิบายไว้ที่นี่: Reshaping data.frame จากกว้างไปยังรูปแบบยาว

library(ggplot2)
library(reshape2)

# original data in a 'wide' format
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
df <- data.frame(x, y1, y2)

# melt the data to a long format
df2 <- melt(data = df, id.vars = "x")

# plot, using the aesthetics argument 'colour'
ggplot(data = df2, aes(x = x, y = value, colour = variable)) + geom_line()

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


15

หากคุณใช้กราฟิกพื้นฐาน (เช่นไม่ใช่กราฟิกขัดแตะ / กริด) คุณสามารถเลียนแบบคุณลักษณะการหยุดพักของ MATLAB โดยใช้ฟังก์ชั่นจุด / เส้น / รูปหลายเหลี่ยมเพื่อเพิ่มรายละเอียดเพิ่มเติมลงในแปลงของคุณโดยไม่ต้องเริ่มพล็อตใหม่ ในกรณีของโครงร่างแบบทวีคูณคุณสามารถใช้par(mfg=...)เพื่อเลือกพล็อตที่คุณเพิ่มสิ่ง



7

แทนที่จะเก็บค่าที่จะลงจุดในอาร์เรย์ให้เก็บไว้ในเมทริกซ์ โดยค่าเริ่มต้นเมทริกซ์ทั้งหมดจะถือว่าเป็นชุดข้อมูลเดียว อย่างไรก็ตามหากคุณเพิ่มจำนวนตัวดัดแปลงลงในพล็อตเช่น col () ตามที่คุณมีแถวในเมทริกซ์ R จะคิดว่าแต่ละแถวควรได้รับการปฏิบัติอย่างอิสระ ตัวอย่างเช่น:

x = matrix( c(21,50,80,41), nrow=2 )
y = matrix( c(1,2,1,2), nrow=2 )
plot(x, y, col("red","blue")

สิ่งนี้จะทำงานได้เว้นแต่ว่าชุดข้อมูลของคุณจะมีขนาดแตกต่างกัน


สิ่งนี้จะให้: ข้อผิดพลาดในถ้า (as.factor) {: อาร์กิวเมนต์ไม่สามารถตีความได้ว่าเป็นตรรกะ
baouss

5

Idiomatic Matlab plot(x1,y1,x2,y2)สามารถแปลเป็น R ด้วยggplot2ตัวอย่างเช่นในวิธีนี้:

x1 <- seq(1,10,.2)
df1 <- data.frame(x=x1,y=log(x1),type="Log")
x2 <- seq(1,10)
df2 <- data.frame(x=x2,y=cumsum(1/x2),type="Harmonic")

df <- rbind(df1,df2)

library(ggplot2)
ggplot(df)+geom_line(aes(x,y,colour=type))

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

แรงบันดาลใจจาก Tingting Zhao ของคู่แปลงสอดคล้องกับช่วงที่แตกต่างกันของแกน x ใช้ ggplot2


5

คุณสามารถใช้ggplotly()ฟังก์ชั่นจากplotlyแพคเกจที่จะเปิดใด ๆ ของgggplot2ตัวอย่างที่นี่เป็นพล็อตแบบโต้ตอบ แต่ฉันคิดว่าการจัดเรียงของพล็อตนี้จะดีกว่าโดยไม่ต้องggplot2 :

# call Plotly and enter username and key
library(plotly)
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

plot_ly(x = x) %>%
  add_lines(y = y1, color = I("red"), name = "Red") %>%
  add_lines(y = y2, color = I("green"), name = "Green")

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


พล็อตดูสดใส; ฟรีหรือเปล่า
เดนิส

@denis มีการลงจุดสาธารณะแบบไม่ จำกัด ฟรีและการลงจุดแบบส่วนตัวหรือแบบเลือกตามที่กำหนด ดูหน้าแผน
Mateo Sanchez

4
แพ็คเกจ R แบบพล็อตคือตอนนี้ฟรีและโอเพ่นซอร์ส 100% (ลิขสิทธิ์ MIT) คุณสามารถใช้กับหรือไม่มีบัญชีพล็อต
Carson

4

คุณสามารถสร้างพล็อตของคุณโดยใช้ggvis :

library(ggvis)

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x, y1, y2)

df %>%
  ggvis(~x, ~y1, stroke := 'red') %>%
  layer_paths() %>%
  layer_paths(data = df, x = ~x, y = ~y2, stroke := 'blue')

สิ่งนี้จะสร้างพล็อตต่อไปนี้:

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


2

การใช้plotly(การเพิ่มโซลูชันจากplotlyกับแกน y และรอง - ดูเหมือนว่าจะหายไป):

library(plotly)     
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

df=cbind.data.frame(x,y1,y2)

  plot_ly(df) %>%
    add_trace(x=~x,y=~y1,name = 'Line 1',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE) %>%
    add_trace(x=~x,y=~y2,name = 'Line 2',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE,yaxis = "y2") %>%
    layout(title = 'Title',
       xaxis = list(title = "X-axis title"),
       yaxis2 = list(side = 'right', overlaying = "y", title = 'secondary y axis', showgrid = FALSE, zeroline = FALSE))

ภาพหน้าจอจากการสาธิตการทำงาน:

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


ฉันรวบรวมรหัสและใช้งานไม่ได้ก่อนทำเครื่องหมายข้อผิดพลาดเป็น%>% แล้วลบออกแล้วทำเครื่องหมายว่าเกิดข้อผิดพลาดError in library(plotly) : there is no package called ‘plotly’ทำไม
Bellatrix

คุณติดตั้งแพคเกจแล้วplotlyหรือยัง คุณต้องติดตั้งแพคเกจโดยใช้install.packages("plotly")คำสั่ง
Saurabh Chauhan

1

เรายังสามารถใช้ห้องสมุดขัดแตะ

library(lattice)
x <- seq(-2,2,0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
xyplot(y1 + y2 ~ x, ylab = "y1 and y2", type = "l", auto.key = list(points = FALSE,lines = TRUE))

สำหรับสีที่เฉพาะเจาะจง

xyplot(y1 + y2 ~ x,ylab = "y1 and y2", type = "l", auto.key = list(points = F,lines = T), par.settings = list(superpose.line = list(col = c("red","green"))))

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

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