ฉันจะจัดเรียงกราฟสองกราฟในแนวตั้งด้วยระดับ x ที่เหมือนกัน แต่มาตราส่วน y ที่แตกต่างใน R ได้อย่างไร


9

ทักทาย,

ขณะนี้ฉันกำลังทำสิ่งต่อไปนี้ใน R:

require(zoo)
data <- read.csv(file="summary.csv",sep=",",head=TRUE)
cum  = zoo(data$dcomp, as.Date(data$date))
data = zoo(data$compressed, as.Date(data$date))
data <- aggregate(data, identity, tail, 1)
cum  <- aggregate(cum, identity, sum, 1)
days = seq(start(data), end(data), "day")
data2 = na.locf(merge(data, zoo(,days)))

plot(data2,xlab='',ylab='compressed bytes',col=rgb(0.18,0.34,0.55))
lines(cum,type="h",col=rgb(0,0.5,0))

สนิปของ summary.csv:

date,revision,file,lines,nclass,nattr,nrel,bytes,compressed,diff,dcomp
2007-07-25,16,model.xml,96,11,22,5,4035,991,0,0
2007-07-27,17,model.xml,115,16,26,6,4740,1056,53,777
2007-08-09,18,model.xml,106,16,26,7,4966,1136,47,761
2007-08-10,19,model.xml,106,16,26,7,4968,1150,4,202
2007-09-06,81,model.xml,111,16,26,7,5110,1167,13,258
...

เส้นสองเส้นสุดท้ายเขียนข้อมูลที่ฉันต้องการและผลลัพธ์คล้ายกับสิ่งต่อไปนี้: ข้อความแสดงแทน เส้นสีน้ำเงินคือเอนโทรปีของสิ่งประดิษฐ์ที่ฉันสนใจ เส้นสีเขียวแสดงถึงเอนโทรปีของการเปลี่ยนแปลง

ตอนนี้ในกราฟนี้มันใช้งานได้ดีเพราะไม่มีความแตกต่างกันมากในเครื่องชั่ง แต่ฉันมีกราฟอื่นที่เส้นสีเขียวเล็กจนมองไม่เห็น

วิธีการแก้ปัญหาที่ฉันกำลังมองหาเกี่ยวข้องกับสองสิ่ง:

  1. หากต้องการย้ายเส้นแนวตั้งสีเขียวไปยังกราฟที่สองให้ต่ำกว่าเส้นแรกด้วยแกน y ของตัวเอง แต่ใช้แกน x ร่วมกัน
  2. เพื่อให้มันเป็นมาตราส่วนลอการิทึมเนื่องจากฉันสนใจ "ขนาด" มากกว่าค่าที่ระบุ

ขอบคุณล่วงหน้า!

ป.ล. ถ้าใครบางคนสามารถบอกฉันได้ว่าฉันจะใส่ "ติ๊กเล็ก ๆ น้อย ๆ " ในระดับ x ที่อ้างถึงเดือนฉันขอบคุณ :-) หากคำถามเหล่านี้มีคำถามมากเกินไปสำหรับโพสต์เดียวฉันสามารถแบ่งพวกเขาต่อไป

คำตอบ:


15

คุณสามารถpar(new=TRUE)ลงจุดในกราฟเดียวกันโดยใช้แกน y ที่แตกต่างกันสองแบบ! สิ่งนี้ควรแก้ปัญหาของคุณด้วย

ถัดไปคุณจะพบตัวอย่างง่าย ๆ ที่พล็อตตัวแปรสองตัวแปรแบบสุ่มหนึ่งตัวในค่าเฉลี่ย 0 อีกอันหนึ่งใช้ค่าเฉลี่ย 100 (ทั้งsd s = 1) ในพล็อตเดียวกัน อันที่หนึ่งสีแดงบนแกน y ด้านซ้ายอันที่สองเป็นสีฟ้าที่แกน y ด้านขวา จากนั้นจะเพิ่มป้ายชื่อแกน

ไปเลย:

x <- 1:10
y1 <- rnorm(10)
y2 <- rnorm(10)+100

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2))
par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,105))

axis(side=2)
axis(side=4)

ดูเหมือนว่านี่ (จำสีแดงบนแกนซ้าย, สีน้ำเงินบนแกนขวา): ข้อความแสดงแทน

อัปเดต:
อิงตามความคิดเห็นฉันสร้างกราฟที่อัปเดตแล้ว ตอนนี้ฉันขุดลึกลงไปในฟังก์ชั่นกราฟฐานโดยใช้par(mar=c(a,b,c,d))เพื่อสร้างระยะขอบที่ใหญ่กว่ารอบกราฟ (จำเป็นสำหรับเลเบลแกนขวา) mtextเพื่อแสดงเลเบลแกนและการใช้axisฟังก์ชันขั้นสูง:

x <- 1:100
y1 <- rnorm(100)
y2 <- rnorm(100)+100

par(mar=c(5,5,5,5))

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2),ylab="")
axis(side=2, at=c(-2,0,2))
mtext("red line", side = 2, line=2.5, at=0)

par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,108), ylab="")
axis(side=4, at=c(98,100,102), labels=c("98%","100%","102%"))
mtext("blue line", side=4, line=2.5, at=100)

ข้อความแสดงแทน

อย่างที่คุณเห็นมันค่อนข้างตรงไปตรงมา คุณสามารถกำหนดตำแหน่งของข้อมูลของคุณด้วยylimในplotฟังก์ชั่นจากนั้นใช้atในaxisฟังก์ชั่นเพื่อเลือกแกนที่คุณต้องการดู นอกจากนี้คุณยังสามารถจัดทำฉลากสำหรับแกนติ๊ก (มีประโยชน์มากสำหรับแกน x เล็กน้อย) ผ่านlabelsในaxisฟังก์ชั่น (ทำได้ที่นี่บนแกนขวา) การเพิ่มป้ายชื่อแกนใช้mtextกับatสำหรับการวางตำแหน่งในแนวตั้ง ( lineสำหรับการวางตำแหน่งแนวนอน)

ตรวจสอบให้แน่ใจในการตรวจสอบ?plot, ?par, ?axisและ?mtextสำหรับข้อมูลเพิ่มเติม
แหล่งข้อมูลบนเว็บที่ดี: Quick-Rสำหรับกราฟ: 1 , 2และ3


น่าสนใจ แต่เราจะบอกผู้อ่านว่าสเกลใดสอดคล้องกับเส้นใด
Hugo Sereno Ferreira

ดูกราฟนี้: imgur.com/K8BCr.png ที่นั่นเราแสดงเลเบลแกน y และทำเครื่องหมายเฉพาะที่ใช้กับข้อมูล (เช่นสำหรับแกนซ้ายที่ด้านบนของกราฟเป็นข้อมูลที่สอดคล้องกัน และสำหรับแกนด้านขวาที่ด้านล่างของกราฟเป็นข้อมูลที่มีความสัมพันธ์กัน) นอกจากนี้เราใช้สีที่แตกต่างกัน (ตามตัวอย่างด้านบน) และประเภทของเส้นและอธิบายไว้ในคำอธิบายภาพ คุณสามารถใช้แผนภูมิเส้นทางซ้ายและแผนภูมิแท่งบนแกนขวาเพื่อทำให้ความแตกต่างชัดเจนขึ้น
Henrik

ตัวอย่างที่คุณได้รับนั้นดีมาก ... คุณจัดการออฟเซ็ตแต่ละแกนในแนวตั้งได้อย่างไร
Hugo Sereno Ferreira

2
ตัวอย่างที่ดีจริงๆ ปัญหาเดียวของกราฟของคุณคือชื่อตัวแปร Y ทั้งสองซ้อนทับกัน ในกรณีนี้คุณต้องการหนึ่งทางด้านซ้ายและอีกทางด้านขวา (อาจอยู่ในตำแหน่งแนวตั้ง) ในการอัพเกรดตัวอย่างของคุณจาก "ดีมาก" เป็น "สมบูรณ์แบบ" คุณอาจต้องการใช้ฟังก์ชัน mtext จาก R เพื่อทำชื่อตัวแปร
Dave Kellen

@Hugo @Dave: ดูการอัปเดตของฉันสำหรับการรวมความคิดเห็นทั้งสองไว้
Henrik

12

ggplot2ฉันคิดว่าคุณจะได้รับสิ่งที่คุณต้องการใช้ ใช้รหัสด้านล่างฉันสามารถผลิต:

ข้อความแสดงแทน

เห็นได้ชัดว่าสิ่งต่าง ๆ เช่นสีเส้นสามารถเปลี่ยนเป็นสิ่งที่คุณต้องการ ในแกน x ฉันระบุบรรทัดหลักในปีและบรรทัดย่อยในเดือน

require(ggplot2)
t = as.Date(0:1000, origin="2008-01-01")  
y1 = rexp(1001)
y2 = cumsum(y1)
df = data.frame(t=t, values=c(y2,y1), type=rep(c("Bytes", "Changes"), each=1001))

g = ggplot(data=df, aes(x=t, y=values)) +
  geom_line() +
  facet_grid(type ~ ., scales="free") +
  scale_y_continuous(trans="log10") +
  scale_x_date(major="years", minor="months") +
  ylab("Log values")
g

เอ่อฉันพยายามตั้งค่า df = data.frame (t = วัน, ค่า = c (data2, cum), พิมพ์ = ตัวแทน (c ("Bytes", "Changes"), แต่ละ = 1001) แต่มันให้ ข้อผิดพลาดใน rbind.zoo (... ): ดัชนีทับซ้อน
Hugo Sereno Ferreira

นั่นเป็นเพราะ data2 และ cum เป็นวัตถุในสวนสัตว์ ใช้ as.vector (data2) เพื่อรับค่า raw นอกจากนี้ฉันใช้ 1001 เพราะฉันสังเกตได้ 1001 คุณจะต้องการสิ่งที่แตกต่าง
csgillespie

ผู้ใช้ Noob R ที่นี่: ข้อผิดพลาดใน data.frame (t = วัน, ค่า = c (as.vector (data2), as.vector (cum))): ข้อโต้แย้งบ่งบอกถึงจำนวนแถวที่แตกต่างกัน: 1063, 1300, 2
Hugo Sereno Ferreira

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