使用ggplot手动选择颜色和轴名称进行R气泡图

时间:2018-07-04 17:27:16

标签: r ggplot2

我使用ggplot创建气泡图。使用以下代码:

ggplot(df, aes(x = order, y = mean, size = n, fill = name)) +
  geom_point(shape = 21) +
  theme_bw() +
  theme() + 
  scale_size(range = c(1, 50)) + 
  ylim(0,100)

除了两个方面,它都可以正常工作:

  1. 对于每个名称(填充),我想手动指定使用的颜色(通过将名称映射为颜色的数据框)-这是为了确保多个图形之间的一致性。
  2. 我想用y上的数字代替文本标签(由于多种原因,由于订购问题,我不能从一开始就使用文本标签)

我已经尝试过分别使用scale_color_manual()和scale_y_continuous的几种方法,但我无济于事!任何帮助将不胜感激!

谢谢

2 个答案:

答案 0 :(得分:0)

由于您尚未指定示例df,因此我创建了自己的示例。

要手动指定颜色,必须使用带有命名矢量的scale_fill_manual作为values的参数。

编辑2

这似乎可以满足您的要求。我们使用scale_y_continuousbreaks参数指定位置的向量,而labels参数指定应该出现在这些位置的标签。由于创建数据帧时已经创建了矢量,因此我们只需将这些矢量作为参数传递即可。

ggplot(df, aes(x = order, y = mean, size = n, fill = name)) +
  geom_point(shape = 21) +
  scale_fill_manual(values = gcolors) +
  scale_size(limits = c(min(df$n), max(df$n))) +
  scale_y_continuous(breaks = mean, labels = order_label)

编辑1

从您的评论看来,您想标记圆圈。一种选择是使用geom_text。下面的代码。您可能需要尝试使用nudge_y的值来获得正确的位置。

order <- c(1, 2)
mean <- c(0.75, 0.3)
n <- c(180, 200)
name <- c("a", "b")
order_label <- c("New York", "London")
df <- data.frame(order, mean, n, name, order_label, stringsAsFactors = FALSE)

color <- c("blue", "red")
name_color <- data.frame(name, color, stringsAsFactors = FALSE)
gcolors <- name_color[, 2]
names(gcolors) <- name_color[, 1]

ggplot(df, aes(x = order, y = mean, size = n, fill = name)) +
  geom_point(shape = 21) +
  geom_text(aes(label = order_label), size = 3, hjust = "inward",
            nudge_y = 0.03) +
  scale_fill_manual(values = gcolors) +
  scale_size(limits = c(min(df$n), max(df$n))) +
  theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank()) +
  ylab(NULL)

原始答案

“用y上的数字替换文本标签”的含义不清楚。在下面的示例中,我已经使用scales::percent_format()函数将y轴格式化为百分比。这跟你想要的相似吗?

order <- c(1, 2)
mean <- c(0.75, 0.3)
n <- c(180, 200)
name <- c("a", "b")
df <- data.frame(order, mean, n, name, stringsAsFactors = FALSE)

color <- c("blue", "red")
name_color <- data.frame(name, color, stringsAsFactors = FALSE)
gcolors <- name_color[, 2]
names(gcolors) <- name_color[, 1]

ggplot(df, aes(x = order, y = mean, size = n, fill = name)) +
  geom_point(shape = 21) +
  scale_fill_manual(values = gcolors) +
  scale_size(limits = c(min(df$n), max(df$n))) +
  scale_y_continuous(labels = scales::percent_format())

答案 1 :(得分:0)

感谢您的所有帮助,效果很好:

ggplot(df, aes(x = order, y = mean, size = n, fill = name)) +
  geom_point(shape = 21) +
  scale_fill_manual(values = gcolors) +
  scale_size(limits = c(min(df$n), max(df$n))) +
  scale_x_continuous(breaks = order, labels = order_label)