Как добавить подтекст к осям в ggplot2 R - PullRequest
0 голосов
/ 08 января 2019

Для основной оси Y и оси X у меня есть общие названия, такие как «Коэффициент танка» и «Счет». Я хочу вторую строку метки, где я указываю соотношение и количество. например. Чуть ниже "Коэффициент танка" я хочу "# в воде / # в песке" меньшим шрифтом, но вдоль оси Y. Аналогично для оси х. Вот основной код

data <- data.frame(set = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4), density = c(1, 3, 3, 1, 3, 1, 1, 1, 3, 3, 1, 3), counts = c(100, 2, 3, 76, 33, 12, 44, 13, 54, 36, 65, 1), ratio = c(1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 90, 1))

library(ggplot2)

ggplot(data, aes(x = counts, y = ratio)) + 
  geom_point() + 
  ylab("Tank's Ratio") + 
  xlab("Counts") 

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Вы можете добавить x и основные заголовки.

РЕДАКТИРОВАТЬ: Это просто смешно!

  #library(extrafont)
#loadfonts(dev="win")
library(tidyverse)
data %>%
ggplot(aes(x=counts, y=ratio)) + geom_point() +
labs(y=expression(atop(bold("Tank's Ratio"),atop(italic("#in water #in sand")))))+
  theme_minimal()+
  theme(axis.title.y = element_text(size=15,family="Comic Sans MS"))

enter image description here

ОРИГИНАЛ:

library(tidyverse) 

      data %>%
    ggplot(aes(x=counts, y=ratio)) + geom_point() +
    labs(y="Tank's Ratio \n #in Water#in sand")
0 голосов
/ 08 января 2019

Вы можете использовать следующий код, определяя поля, названия осей и подзаголовки самостоятельно:

Мы используем theme для увеличения нижнего и левого поля и для подавления автоматически сгенерированных заголовков осей.

Мы используем annotate для генерации текста, который служит заголовком оси и субтитром, при необходимости текст поворачивается.

Мы генерируем график, превращаем его в grob, и с помощью этого grob мы можем повернуть отсечение и показать график.

g1 <- ggplot(data = data, aes(x = counts, y = ratio, group = 1)) +
  geom_point()  + 

  ## increase margin size for left and bottom and
  ## remove the axis titles
  theme(plot.margin = unit(c(1, 1, 4, 4), "lines"),
        axis.title.y = element_blank(),
        axis.title.x = element_blank() ) +

  ## define the plotting area to NOT include the annotations
  coord_cartesian(xlim = c(0, 100), ylim= c(0, 100), expand = FALSE) +

  ## annotate y axis
  annotate(geom = "text", x = -9, y = 50, label = "Tank's Ratio", angle = 90, size = 5) +
  annotate(geom = "text", x = -5, y = 50, label = "#in water/#in sand", angle = 90, size = 4) +

  ## annotate x axis
  annotate(geom = "text", x = 50, y = -5, label = "Counts", size = 5) +
  annotate(geom = "text", x = 50, y = -9, label = "#in water/#in sand", size = 4)

## turn off  clipping for axis extra labels
g2 <- ggplot_gtable(ggplot_build(g1))
g2$layout$clip[g2$layout$name == "panel"] <- "off"
grid::grid.draw(g2)

Это дает следующую картину:

enter image description here

Пожалуйста, дайте мне знать, хотите ли вы этого.

0 голосов
/ 08 января 2019

Это не самое элегантное решение, но надеюсь, что оно поможет:

library(ggplot2)
library(gridExtra)
library(grid)

Сначала создайте сюжет без ylab:

g <- ggplot(data, aes(x = counts, y = ratio)) + 
  geom_point()  +
  ylab("") + 
  xlab("Counts") 

Затем добавьте субтитры для обеих осей:

g2 <- grid.arrange(g, 
                   bottom = textGrob("in water/ # in sand", 
                                     x = 0.55, y = 1, gp = gpar(fontsize = 9)),
                   left = textGrob("in water/ # in sand",  rot = 90, 
                                   x = 1.5, gp = gpar(fontsize = 9)))

И, наконец, добавить описание оси y

grid.arrange(g2, 
             left = textGrob("Tank's Ratio",  rot = 90, 
                             x = 1.7, gp = gpar(fontsize = 12)))

enter image description here

...