2017-08-22 162 views
0

我正嘗試在一個ggplot2圖中創建一個圖例,每行上有多行和一個參數和值。由於我將符號作爲變量,因此需要使用expression來完成。爲了創建新的線條,我使用了多個atop命令,但這會導致最後一行中的間距不均勻。請參閱我下面的例子:等於多個頂部的間距

library(ggplot2) 

N = 25 

a = -5 
b = 2 
sigma = 1 

x = runif(N, 0, 10) 
y = a + x * b + rnorm(N, sd = sigma) 

df = data.frame(x, y) 

ggplot(df, aes(x, y)) + 
    geom_point() + 
    geom_label(aes(x = 1, y = max(y) - 2), 
      label = paste0("atop(atop(", 
          "textstyle(a == ", a, "),", 
          "textstyle(b == ", b, ")),", 
          "textstyle(sigma == ", sigma, "))" 
      ), parse = TRUE 
) 
ggsave("plotmath_atop.png", width = 6, height = 4, scale = 1) 

這給出了以下情節:plotmath with atop 正如你所看到的,線b=2\sigma=1之間的間隔明顯比線a=-5b=2之間的間距較大。

有沒有一種方法使用expression多行換行,而每行之間仍然有間距?

+1

這可能幫助:https://stackoverflow.com/a/39784690/471093 – baptiste

+0

@ baptiste看起來很有希望,我會檢查一下。謝謝! – tkmckenzie

回答

3

你可以使用gridExtra :: tableGrob,

enter image description here

library(gridExtra) 
library(grid) 

table_label <- function(label, params=list()) { 

    params <- modifyList(list(hjust=0, x=0), params) 

    mytheme <- ttheme_minimal(padding=unit(c(1, 1), "mm"), 
          core = list(fg_params = params), parse=TRUE) 
    disect <- strsplit(label, "\\n")[[1]] 
    m <- as.matrix(disect) 
    tg <- tableGrob(m, theme=mytheme) 
    bg <- roundrectGrob(width = sum(tg$widths) + unit(3, "mm"), height = sum(tg$heights) + unit(3, "mm")) 
    grobTree(bg, tg) 

} 

txt <- 'a == -5\n 
     b == 2\n 
     sigma == 1' 


library(ggplot2) 

qplot(1:10,1:10) + 
    annotation_custom(table_label(txt), xmin=0, xmax=5, ymin=7.5) 
+0

這樣做,謝謝! – tkmckenzie

1

一個簡單的解決方案是避免使用表達式,使用unicode字符\ u03c3打印sigma字母,並使用\ n打斷行。

library(ggplot2) 
N = 25 
a = -5 
b = 2 
sigma = 1 
df = data.frame(runif(N, 0, 10), a + x * b + rnorm(N, sd = sigma)) 

lab <- paste0("a = ", a, "\n", 
       "b = ", b, "\n", 
       "\u03c3 = ", sigma) 

ggplot(df, aes(x, y)) + 
geom_point() + 
geom_label(aes(x = 1, y = max(y) - 2), label = lab, parse = FALSE) 

ggsave("plot_multiline_label.png", width = 6, height = 4, scale = 1) 

enter image description here

+0

謝謝,但不幸的是,我不相信unicode會爲我正在尋找的東西工作。雖然sigma符號與'expression'中的符號非常相似,但其他符號(如tau)不符合標準字體,也不符合標準字體。此外,我需要將一些變量名稱斜體化,這似乎不適用於此解決方案(請糾正我,如果我錯了)。 – tkmckenzie