同一刻度/标签

时间:2018-12-21 10:42:24

标签: r ggplot2 axis-labels

我的数据:

dat <- data.frame(x = c(1,2,3,4,5,6), y = c(2,3,4,6,2,3))

我的情节的痕迹和标签:

breaks <- c(3,5)
labels <- c(paste(3,"(0.3)"), paste(5,"(0.5)"))

我的情节:

library(ggplot2)
ggplot() + 
  geom_point(data = dat, aes(x = x, y = y)) + 
  scale_y_continuous(breaks = breaks, labels = labels)

我希望对相同的标签进行不同的着色。例如,我希望用不同于“(0.3)”的颜色给“ 3”上色。

2 个答案:

答案 0 :(得分:2)

这是将2个图和patchwork粘贴在一起的一种方法,cowplotlibrary(tidyverse) library(patchwork) lbl_int <- str_extract(labels, "^\\d+") lbl_frac <- str_extract(labels, "\\(.+\\)") 类似,但具有更大的灵活性。我将标签分成2个向量,一个带有整数,一个带有括号的小数。然后绘制2个图,一个用于没有其他标记的外部标签,另一个用于主图。

经过一轮尝试构建后,我开始调整每个主题的边距,意识到我需要将顶部和底部边距设置为相同,但在左侧图的右侧和左侧均未设置边距右侧图的一侧,因此它们之间的空间很小。肯定还有调整的方法,但是我将从一些间距开始。

(main_plot <- ggplot(dat, aes(x = x, y = y)) + 
  geom_point() + 
  scale_y_continuous(breaks = breaks, labels = lbl_frac) +
  theme(axis.text.y.left = element_text(color = "gray"), 
        axis.title.y.left = element_blank(),
        plot.margin = margin(1, 1, 1, 0, "mm")))

主图非常简单,只需删除主题左侧的元素即可。

(int_plot <- ggplot(dat, aes(x = 0, y = y)) + 
  scale_y_continuous(breaks = breaks, labels = lbl_int) +
  theme(axis.text.y.left = element_text(color = "black"), 
        axis.title.y.left = element_text(color = "black"),
        axis.title.x = element_blank(),
        panel.grid = element_blank(),
        axis.ticks = element_blank(),
        axis.text.x = element_blank(),
        panel.background = element_blank(),
        plot.margin = margin(1, 0, 1, 1, "mm")))

外部标签的图删除了大多数主题元素,但具有y轴标题和标签。

patchwork

然后,+可以轻松地将图添加在一起(实际上是与int_plot + main_plot + plot_layout(ncol = 2, widths = c(1e-3, 1)) 一起添加),然后设置宽度。同样,您可以根据需要进行调整,但是与右图相比,我使左图非常瘦。

var data = new FormData();

data.append('file', { uri: data.uri, name: 'picture.jpg', type: 'image/jpg' });
// Create the config object for the POST
    const config = {
        method: 'POST',
        body: data
    };
    fetch('URL', config).then(responseData => {
        // Log the response form the server // Here we get what we sent to Postman 
     back
        console.log(responseData);
    })
    .catch(err => { console.log(err); });

reprex package(v0.2.1)于2018-12-21创建

答案 1 :(得分:1)

这是可以帮助您前进的东西(我改编的this答案的信用)。

我们使用annotate在两个不同的x轴坐标上绘制labels,这将作为我们的标签(因此我们需要关闭theme中的实际标签)。

首先,我们用不同的颜色创建两个我们想要的确切标签的向量。

dat <- data.frame(x = c(1,2,3,4,5,6), y = c(2,3,4,6,2,3))

breaks <- c(3,5)
labels_new1 <- c(NA, NA, 3, NA, 5, NA) # NA in order to skip that annotation
labels_new2 <- c(NA, NA, "(0.3)", NA, "(0.5)", NA)

重要部分:

  • coord_cartesian(xlim = c(0, 6), expand = FALSE) + # this will cut our plot properly

  • plot.margin = unit(c(1, 1, 1, 5), "lines") # this will give us some space on the left

请注意,在像这样定义的coord_cartesian中,我们实际上是切断了两个注释(请注意,您在下一部分(-1,-0.5)中看到的两个x值不在xlim之外范围)。

绘制对象:

g1 <- ggplot() + 
  geom_point(data = dat, aes(x = x, y = y)) + 
  annotate(geom = "text", y = seq_len(nrow(dat)), x = -1, label = labels_new1, size = 4) +
#first the number add color = "blue" for example
  annotate(geom = "text", y = seq_len(nrow(dat)), x = -0.5, label = labels_new2, size = 4, color = "red") +
#second the parenthesis (colored in red)
  coord_cartesian(xlim = c(0, 6), expand = FALSE) +
  scale_y_continuous(breaks = breaks) +
#now lets shut off the labels and give us some left space in the plot 
  theme(plot.margin = unit(c(1, 1, 1, 5), "lines"),
        axis.title.y = element_blank(),
        axis.text.y = element_blank())

最后:

g2 <- ggplot_gtable(ggplot_build(g1)) # convert to grob
g2$layout$clip[g2$layout$name == "panel"] <- "off" # clipping of the axes
# this will show the two annotations that we left off before
grid::grid.draw(g2)

enter image description here

备注:

您可以使用x=-1x=-0.5来移动两个注释,并使用c(1, 1, 1, 5)中的最后一个值在左侧留出更多空间。

labels_new1labels_new2非常重要,它们正在做您想展示某些东西的 where 的所有繁重工作。 / p>