2017-08-22 144 views
10

我有一些y軸標籤,我希望所有的座標都相同。標籤由2個變量組成,我想將正確的間距放在左邊的變量左對齊,右邊的變量右對齊。我認爲這是一項微不足道的任務,事實上,在data.frame中使用stringi包中的字符串填充函數很容易。然而情節沒有理想的路線。左右對齊座標軸的文本間的精確間距

library(stringi) 
library(tidyverse) 

paster <- function(x, y, fill = ' '){ 
    nx <- max(nchar(x)) 
    ny <- max(nchar(y)) 
    paste0(
     stringi::stri_pad_right(x, nx, fill), 
     stringi::stri_pad_left(y, ny, fill) 
    ) 
} 

plot_dat <- mtcars %>% 
    group_by(gear) %>% 
    summarize(
     n = n(), 
     drat = mean(drat) 
    ) %>% 
    mutate(
     gear = case_when(
      gear == 3 ~ 'three and free', 
      gear == 4 ~ 'four or more', 
      TRUE ~ 'five' 
     ), 
     label = paster(gear, paste0(' (', n, ')')) 
    ) 

plot_dat 

## # A tibble: 3 x 4 
##    gear  n  drat    label 
##   <chr> <int> <dbl>    <chr> 
## 1 three and free 15 3.132667 three and free (15) 
## 2 four or more 12 4.043333 four or more (12) 
## 3   five  5 3.916000 five   (5) 

plot_dat %>% 
    ggplot(aes(x = drat, y = label)) + 
     geom_point() 

給出:

enter image description here

我要的是:

enter image description here

+0

[R ggplot中的左對齊刻度標記標籤]的可能重複(https://stackoverflow.com /問題/ 30510653 /左對齊蜱馬克-1 abel-in-r-ggplot) – neilfws

+0

是的,我意識到所有這些問題的更仔細的閱讀:) – neilfws

+0

不是你想要的,但可能使用'n'作爲主y軸和文本作爲[輔助y軸] (http://ggplot2.tidyverse.org/reference/sec_axis.html)?不是地塊上單聲道字體的大粉絲。 – zx8754

回答

9

你的文本字符串很好地隔開根據等寬字體(這是什麼[R控制檯使用)。

軸標籤的字體家族設置爲等寬字體會給出正確的定位:

ggplot(mtcars, 
     aes(x = drat, y = label)) + 
    geom_point() + 
    theme(axis.text.y = element_text(family = "mono")) 

plot with properly aligned y axis labels

(不是最漂亮的樣子,我知道......但你的基本思路。我還沒有在R &中使用很多字體,這是我現在能想到的唯一等寬字體。)

+5

您可以使用'extrafont'包使其他面可用於繪圖。在那裏有一些很好的等寬字體。 – Brian