8

1x3 レイアウトで 3 つのグラフをプロットしたいと考えています。縦軸ラベルが必要なのは最初のグラフだけですが、3 つのプロット エリアすべてをまったく同じサイズにしたいと考えています。グラフのどれも、またはすべてが軸ラベルを持っていない場合、これは問題になりません。しかし、1 つのグラフには軸ラベルがあり、他の 2 つのグラフには軸ラベルがない場合、3 つのグラフすべてを同じサイズにするにはどうすればよいでしょうか? それが私が最もよく知っていることなので、ベースグラフィックスでこれをやろうとしていますが、問題を解決するためのより良い方法を提供する場合は、グリッドまたは 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)

[更新:私の質問に最も直接的に答えた回答を選択しました。これはベース グラフィックスにありましたが、同じことをlatticeとで行う方法を示しているので、他のソリューションも参照することをお勧めしggplot2ます。]

ここに画像の説明を入力

4

4 に答える 4

8

ベース グラフィックスの場合、通常のマージンではなく外側のマージンを使用します。par(mar=c(5,15,4,1))最初の呼び出しを に置き換えてpar(oma=c(0,15,0,0))2 番目の呼び出しを削除するだけparで、プロットは同じスペースになります (そして、軸ラベルは左側の外側の余白にくっつきます)。

于 2012-09-24T21:13:24.783 に答える
7

基本グラフィックスを使用する最も簡単な方法は、y 軸ラベルなしですべてを作成し、3 つすべての左側の追加パネルにラベルを個別に追加することです。

しかし、このようなタスクが発明された理由の 1 つですlatticeggplot特にウィリアム・クリーブランドのファンなら、ドットプロットを検討することもできます。

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)

ここに画像の説明を入力 ここに画像の説明を入力

于 2012-09-24T20:38:52.877 に答える
6

を使用して何かをつなぎ合わせることができたかもしれませんが、 ggplot2layoutのファセット機能を使用してそれを行う方が高速でした:

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

ここに画像の説明を入力してください

于 2012-09-24T20:33:45.627 に答える
4

Greg Snow の回答を拡張すると (フォローアップの質問に照らして)、基本グラフィックスを使用してコードを最小限に編集したものを次に示します。

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() への1回の呼び出しですべてのパラメーターを割り当てることです

于 2012-09-24T23:28:31.383 に答える