2017-09-14 17 views
2

複数のggplotを1つのpdfに保存します。それはかなりうまくいく。問題は、異なるプロットが異なるy軸テキストを持つことです。実際のプロット(x軸とy軸)の長さが異なるのは、y軸の記述の長さが異なるためです。私はx軸の正確な幅を何とかハードコーディングして、プロットの位置がずれてしまうようにする必要があります。ここggplot:同じプロット比で複数のプロットを1つのpdfに保存

は、問題の例は次のとおり

library(dplyr) 
library(ggplot2) 

v1 <- c(1, 1, 1); v2 <- c(1, 0, 0) 
v3 <- c(1, 0, 1); v4 <- c(0, 1, 1) 
v5 <- c(1, 0, 1); xG <- c(3, 3, 3, 3, 3) 

input <- c(v1, v2, v3, v4, v5) 

df <- data_frame(values = input, 
      module = c(rep("A", length(v1)), 
         rep("B", length(v2)), 
         rep("C", length(v3)), 
         rep("D", length(v4)), 
         rep("E", length(v5)))) 

perWorkField <- df %>% 
    group_by(module) %>% 
    summarise(sums = sum(values)) %>% 
    mutate(percent = round((sums/xG) * 100, 2)) 

a <- ggplot() + 
    geom_point(data = perWorkField, mapping = aes(x = percent, y = module)) + 
    xlim(c(0, 100)) 

df2 <- perWorkField %>% mutate(module = replace(module, module == "A", "ThisIsALongText")) 

b <- ggplot() + 
geom_point(data = df2, mapping = aes(x = percent, y = module)) + 
xlim(c(0, 100)) 

pdf("test.pdf") 
print(list(a, b)) 
dev.off() 

答えて

1

解決策1:

ylab(即ちylab("module\n\n\n\n\n"))に改行(\n)を追加Link

ここで再生可能コードです。このように、軸のタイトルとプロットの間のスペースを広げます。

a <- ggplot() + 
    geom_point(data = perWorkField, mapping = aes(x = percent, y = module)) + 
    xlim(c(0, 100)) + 
    ylab("module\n\n\n\n\n") 

解決方法2:

非常に汚いハック:あなたのテキストに空白を追加します。私の解決策の問題は、nWhiteSpaceを手動で調整する必要があるということです(つまり、nchar("ThisIsALongText")と等しくない)。

nWhiteSpace <- 24 
foo <- paste(c(rep(" ", nWhiteSpace), "A"), collapse = "") 
foo 
[1] "      A" 


df1 <- perWorkField %>% mutate(module = replace(module, module == "A", foo)) 

a <- ggplot() + 
    geom_point(data = df1, mapping = aes(x = percent, y = module)) + 
    xlim(c(0, 100)) 

df2 <- perWorkField %>% mutate(module = replace(module, module == "A", "ThisIsALongText")) 

b <- ggplot() + 
geom_point(data = df2, mapping = aes(x = percent, y = module)) + 
xlim(c(0, 100)) 

pdf("test.pdf") 
print(list(a, b)) 
dev.off() 

enter image description here

+0

ありがとうございました。私はファイルごとに5つの異なるプロットしかないので、これは依然としてreliazableになります。私はもっ​​と便利な機能はないと思っています。 – jeypeu

+1

@jeypu私はクリーナーで私の答えを更新しましたが、まだハッキーな解決策です。 – PoGibas

1

この溶液をこのポストに基づいている:

Get width of plot area in ggplot2

Iは、両方のプロットのx軸長を抽出し、 によって両者の差をより広いプロットをオフセットx軸の長さ。

EDIT:

は、このソリューションは完璧ではないことが判明します。プロットはわずかにオフセットされているため、このソリューションでも手作業による手抜きが必要です。

library(dplyr) 
library(ggplot2) 
library(grid) 

v1 <- c(1, 1, 1); v2 <- c(1, 0, 0) 
v3 <- c(1, 0, 1); v4 <- c(0, 1, 1) 
v5 <- c(1, 0, 1); xG <- c(3, 3, 3, 3, 3) 

input <- c(v1, v2, v3, v4, v5) 

df <- data_frame(values = input, 
       module = c(rep("A", length(v1)), 
          rep("B", length(v2)), 
          rep("C", length(v3)), 
          rep("D", length(v4)), 
          rep("E", length(v5)))) 

perWorkField <- df %>% 
    group_by(module) %>% 
    summarise(sums = sum(values)) %>% 
    mutate(percent = round((sums/xG) * 100, 2)) 

a <- ggplot() + 
    geom_point(data = perWorkField, mapping = aes(x = percent, y = module)) + 
    xlim(c(0, 100)) 

a 
current.vpTree() 
seekViewport('xlab-t.4-4-4-4') 
x_axis_a <- convertWidth(unit(1,'npc'), 'inch', TRUE) 
x_axis_a 

df2 <- perWorkField %>% mutate(module = replace(module, module == "A", "ThisIsALongText")) 

b <- ggplot() + 
    geom_point(data = df2, mapping = aes(x = percent, y = module)) + 
    xlim(c(0, 100)) 

b 
current.vpTree() 
seekViewport('xlab-t.4-4-4-4') 
x_axis_b <- convertWidth(unit(1,'npc'), 'inch', TRUE) 
x_axis_b 

a <- a + theme(plot.margin = unit(c(1,1,1,1+abs(x_axis_b - x_axis_a)),"inch")) 
b <- b + theme(plot.margin = unit(c(1,1,1,1),"inch")) 

pdf("test.pdf") 
print(list(a, b)) 
dev.off() 

非常にハッキリですが、私のトリックです。

+0

私はあなたのコードを使ってpdfを作成すると、かなり近いですが、正確に同じサイズではありません。 – jeypeu

+1

あなたはそうです、それは確かにわずかに相殺されています。私はそれに気付かなかった。私の答えを編集して言及します。 – PejoPhylo

関連する問題