【问题标题】:How to add two different magnitudes of point size in a ggplot bubbles chart?如何在 ggplot 气泡图中添加两个不同大小的点大小?
【发布时间】:2019-04-10 03:57:48
【问题描述】:

我刚刚遇到了这样的图表,其中使用了两种颜色的 geom_point(我相信它是由 ggplot2 制作的)。同样,我希望一种颜色的点的大小范围为 1 到 5,而另一种颜色的点的范围为 10 到 50。但是我不知道如何添加两个不同的点范围一张图。

在我的基本步骤中:

a <- c(1,2,3,4,5)
b <- c(10,20,30,40,50)
Species <- factor(c("Species1","Species2","Species3","Species4","Species5"))
bubba <- data.frame(Sample1=a,Sample2=b,Species=Species)
bubba$Species=factor(bubba$Species, levels=bubba$Species)
xm=melt(bubba,id.vars = "Species", variable.name="Samples", value.name = "Size")
str(xm)
ggplot(xm,aes(x= Samples,y= fct_rev(Species)))+geom_point(aes(size=Size))+scale_size(range = range(xm$Size))+theme_bw()

有没有我应该调查的线索?谢谢!

【问题讨论】:

  • 你能提供一个MCVE吗?也就是能不能加一些数据让你的代码运行起来?
  • 是:'a
  • 您可以编辑您的问题并将其添加到那里,使其与代码标签等保持整洁。
  • ggplot 旨在防止这种情况。在您的情况下,size 无法实现相同美学的单独比例尺,因为这会导致难以理解可视化
  • 嗨 Nate,我只是假设上面的图表是由 ggplot2 制作的,因为它的背景。但是,如果您有除 ggplot2 之外的其他选择,我也将不胜感激!

标签: r ggplot2 graph-visualization


【解决方案1】:

我有一种方法可以完成 90% 的工作,但我不确定如何完成任务。为了获得大小的单个图例,我使用转换将输入大小转换为显示大小。这使得图例外观符合显示。我还没有弄清楚如何对fill 应用类似的转换,以便将两者集成到同一个图例中。

这是转换,在这种情况下将所有内容缩小 10 或更多:

library(scales)
shrink_10s_trans = trans_new("shrink_10s",
          transform = function(y){
            yt = if_else(y >= 10, y*0.1, y)
            return(yt)
          },
          inverse = function(yt){
            return(yt) # Not 1-to-1 function, picking one possibility
          }
)

然后我们可以对大小使用这种转换来选择性地只缩小 10 或更大的点。除了将填充编码与尺寸编码相结合之外,这对于图例来说效果很好。

ggplot(xm,aes(x= Samples,y= fct_rev(Species), fill = Size < 10))+
  geom_point(aes(size=Size), shape = 21)+
  scale_size_area(trans = shrink_10s_trans, max_size = 10,
                  breaks = c(1,2,3,10,20,30,40),
                  labels = c(1,2,3,10,20,30,40)) +
  scale_fill_manual(values = c(rgb(136,93,100, maxColorValue = 255),
                               rgb(236,160,172, maxColorValue = 255))) +
  theme_bw()

【讨论】:

  • 非常感谢乔恩!在这一点上,这不是一个大问题,我将能够使用 Illustrator 添加颜色。不那么令人满意,但它已经非常接近我的目标了。再次感谢!
【解决方案2】:
a <- c(1, 2, 3, 4, 5)
b <- c(10, 20, 30, 40, 50)

Species <- factor(c("Species1", "Species2", "Species3", "Species4", "Species5"))

bubba <- data.frame(Sample1 = a, Sample2 = b, Species = Species)
bubba$Species <- factor(bubba$Species, levels = bubba$Species)
xm <- reshape2::melt(bubba, id.vars = "Species", variable.name = "Samples", value.name = "Size")

ggplot(xm, aes(x = Samples, y = fct_rev(Species))) +
  geom_point(aes(size = Size, color = Size)) +
  scale_color_continuous(breaks = c(1,2,3,10,20,30), guide = guide_legend()) +
  scale_size(range = range(xm$Size), breaks = c(1,2,3,10,20,30)) +
  theme_bw()

【讨论】:

  • 但是当值(即相对丰度)不是由一个因素精确定义时呢?例如,在 OP 的图中,有小于 10 的棕色符号(但可能大于 3,否则它们会是粉红色的符号)。
  • 它现在使用您的数据。如果您想更改圆圈大小或使用离散颜色,您将不得不与guides() 或使用因素进行一些争论。
  • 谢谢!是的,我的观点是,例如在图中,您注意到中断尺寸 3 和中断 40 尺寸相同,但颜色不同。我在这一点上挣扎。不过非常感谢!
【解决方案3】:

这是一个杂物。我现在没有时间弄清楚这个传说。请注意,1 和 10 的大小相同,但颜色不同,3 和 40 也是如此。

# Create data frame
a <- c(1, 2, 3, 4, 5)
b <- c(10, 20, 30, 40, 50)
Species <- factor(c("Species1", "Species2", "Species3", "Species4", "Species5"))
bubba <- data.frame(Sample1 = a, Sample2 = b, Species = Species)

# Restructure data
xm <- reshape2::melt(bubba, id.vars = "Species", variable.name = "Samples", value.name = "Size")

# Calculate bubble size
bubble_size <- function(val){
  ifelse(val > 3, (1/15) * val + (1/3), val)
}

# Calculate bubble colour
bubble_colour <- function(val){
  ifelse(val > 3, "A", "B")
}

# Calculate bubble size and colour
xm %<>% 
  mutate(bub_size = bubble_size(Size),
         bub_col = bubble_colour(Size))

# Plot data
ggplot(xm, aes(x = Samples, y = fct_rev(Species))) +
  geom_point(aes(size = bub_size, fill = bub_col), shape = 21, colour = "black") +
  theme(panel.grid.major = element_line(colour = alpha("gray", 0.5), linetype = "dashed"),
        text = element_text(family = "serif"),
        legend.position = "none") + 
  scale_size(range = c(1, 20)) +
  scale_fill_manual(values = c("brown", "pink")) +
  ylab("Species")

【讨论】:

  • 非常感谢!图例不会是问题,在这一点上我确信我已经能够将它设置正确的尺寸数据并使用 Illustrator 完成工作(虽然不完全令人满意,但如果它有效!)。但是我遇到了 %% is function not found 的问题。除了我应该添加的特定包吗?
  • 啊,是的。我忘了说:复合赋值运算符需要magrittr 包。
【解决方案4】:

我认为您正在寻找 R 中的气泡图

https://www.r-graph-gallery.com/bubble-chart/

也就是说,您可能希望分别构建图形的右侧和左侧,然后合并。

【讨论】:

  • 嗨 jrakru56,是的,我知道谢谢。我对添加两个不同的比例有疑问。如图所示,大小值 1 到 3 的点大小范围和大小范围 10 到 40 的另一组点。我正在努力解决这个问题。
  • 哦,我明白了!其实,我错了。这不是气泡图。它只是一个常规图,基于某些 bin 大小,不同组具有不同的符号。您可以使用点形状和点大小的组合来实现相同的效果。
  • df &lt;- mtcars[, c("mpg", "cyl", "wt")]; df1 &lt;- df %&gt;% filter(wt &lt;4); df2 &lt;- df %&gt;% filter(wt &gt;=4); ggplot() + geom_point(data = df1, aes(x=wt, y=mpg), shape=21, fill="steelblue", color="darkred", size=3) + geom_point(data = df2, aes(x=wt, y=mpg), shape=21, fill="steelblue", color="darkred", size=10)
猜你喜欢
  • 2021-11-26
  • 2013-03-18
  • 2018-06-10
  • 2011-12-23
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多