2012-09-24 21 views
6

我想在1x3佈局中繪製三張圖。只有第一個圖需要有垂直軸標籤,但我希望所有三個繪圖區的大小完全相同。如果沒有或全部圖表都有軸標籤,這將是沒有問題的。但是,如果一個軸標籤和另外兩個沒有標籤,我怎樣才能得到所有三張相同的圖形?我試圖在基本圖形中執行此操作,因爲這是我最瞭解的,但如果它們提供更好的方法來解決我的問題,我很樂意使用grid或ggplot2。如何創建多個圖,每個圖都具有相同的繪圖區大小,只有一個繪圖具有軸標籤時?

下面是一些假的數據,我的繪圖代碼,情節本身:

# Fake Data 
data = structure(list(y1 = 1:5, y2 = c(1.2, 2.4, 3.6, 4.8, 6), y3 = c(1.44, 
2.88, 4.32, 5.76, 7.2)), .Names = c("y1", "y2", "y3"), 
row.names = c("I needed 12 units for financial aid", 
       "I couldn't find any other open classes", 
       "I might be adding a major or minor", 
       "The class seemed interesting", "The class fit into my schedule" 
), class = "data.frame") 

# Plotting code 
par(mar=c(5,15,4,1)) 
par(mfrow=c(1,3)) 
barplot(data$y1,names.arg=row.names(data), horiz=TRUE,las=1, + 
     xlim=c(0,8), main="Group 1") 
par(mar=c(5,1,4,1)) 
barplot(data$y2,names.arg=row.names(data), horiz=TRUE,las=1, + 
     axisnames=FALSE, xlim=c(0,8), main="Group 2") 
barplot(data$y3,names.arg=row.names(data), horiz=TRUE,las=1, + 
     axisnames=FALSE, xlim=c(0,8), main="Group 3") 

# Reset plot options back to defaults 
par(mfrow=c(1,1) 
par(mar=c(5,4,4,2)+0.1) 

[更新:我選擇最直接地回答我的問題,這是在基礎圖形的答案,但我建議在其他的解決方案看爲好,因爲他們展示如何做同樣的事情在latticeggplot2]

enter image description here

回答

8

爲基礎的圖形要使用一個外邊,而不是常規的利潤。只需將第一個par(mar=c(5,15,4,1))替換爲par(oma=c(0,15,0,0)),並將第二個電話號碼移除至par,並且繪圖將佔用相等的空間(並且軸標籤將粘到左側的外邊距上)。

+0

更改'oma'設置似乎是「重置」繪圖區域。例如,如果我用'oma = c(0,15,0,0)'創建第一個繪圖,然後調用'par(oma = c(0,0,0,0))',然後調用plot(。 ..)',我結束了兩個獨立的情節,而不是在同一個「頁面」上的兩個情節。有沒有辦法告訴R在第一個情節之後保留相同的1x3繪圖區域,即使我稱之爲「oma」? – eipi10

+0

@ eipi10你應該只設置一次'oma'參數,不要在各個幀之間改變它。 –

+0

工作,謝謝。出於好奇,爲什麼你不必在繪製第一個繪圖之後將'oma'重置回c(0,0,0,0)?另外,爲了將來的參考,在某些情況下,人們想要在圖之間改變圖形參數,是否有辦法阻止R重新設置繪圖區? – eipi10

6

我能公關obably件東西一起使用layout,但使用的GGPLOT2的刻面功能來做到這一點,這只是速度更快:

data$grp <- rownames(data) 
datam <- melt(data,id.vars = "grp") 
ggplot(datam,aes(x = grp,y = value)) + 
    facet_wrap(~variable,nrow = 1) + 
    geom_bar(stat = "identity") + 
    coord_flip() 

enter image description here

7

最簡單的方式與基地的圖形可能是讓他們都沒有y軸標籤,然後分別在其他三個面板的左側添加標籤。

但是像這樣的任務是爲什麼lattice(和ggplot,就此而言)被髮明的原因之一。你也可以考慮一個dotplot,特別是如果你是威廉克利夫蘭的粉絲。

library(reshape2) 
d2 <- data 
d2$q <- rownames(d2) 
d2 <- melt(d2, measure.vars=1:3, id.vars=4) 
d2$q <- factor(d2$q, levels=rownames(data)) 

library(lattice) 
barchart(q ~ value|variable, data=d2) 
dotplot(q ~ value|variable, data=d2) 

enter image description here enter image description here

4

對格雷格雪的回答擴大(在你的後續問題的光),這裏是你的代碼的最小編輯與基地圖形做的:

op <- par(oma=c(0,15,0,0), mfrow=c(1,3), mar=c(5,1,4,1)) 
barplot(data$y1,names.arg=row.names(data), horiz=TRUE,las=1, xlim=c(0,8), main="Group 1") 
barplot(data$y2,names.arg=row.names(data), horiz=TRUE,las=1, axisnames=FALSE, xlim=c(0,8), main="Group 2") 
barplot(data$y3,names.arg=row.names(data), horiz=TRUE,las=1, axisnames=FALSE, xlim=c(0,8), main="Group 3") 
par(op) 

的關鍵在於避免「復位」你提到將一次調用中的所有參數分配給par()

相關問題