【问题标题】:Customised Bubble plot自定义气泡图
【发布时间】:2021-05-26 22:04:21
【问题描述】:

我正在尝试做一个气泡图。我的数据是:

Year<-rep(2001:2005, each = 5)
name<-c("John","Ellen","Mark","Randy","Luisa")
Name<-c(rep(name,5))
Value<-sample(seq(0,25,by=1),25)
mydata<-data.frame(Year,Name,Value)

到目前为止,我已经到了这一点:

ggplot(mydata, aes(x=Year, y=Name, size = Value)) +
  geom_point() +
  theme(axis.line = element_blank(),
        axis.text.x=element_text(size=11,margin=margin(b=10),colour="black"),
        axis.text.y=element_text(size=13,margin=margin(l=10),colour="black",
                                 face="italic"),
        axis.ticks = element_blank(),
        axis.title=element_text(size=18,face="bold"),
        panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        legend.text = element_text(size=14),
        legend.title = element_text(size=18))

我需要很多修改,但我不明白怎么做(我对 ggplot2 不是很熟悉)。 首先,我想使用viridis 刻度,但scale_color_viridisscale_fill_viridis 都不起作用(我也尝试设置discrete=T 参数)。

其次,我想避免绘制 0 值(即,在绘制 0 值的地方有一个空格),但既不使用na.omit(例如ggplot(na.omit(mydata), aes(x=Year, y=Name, size = Value))ggplot(mydata, aes(x=Year, y=Name, size = na.omit(Value))))或从 Value 对象工作中删除 0。

第三,我希望图例是一个连续的比例:Value 的绘制值在 1 到 25 的范围内(因为我想删除零)但默认图例是离散的 5分差。

我希望情节看起来或多或少像这样(气泡大小取决于Value 的值):

有什么建议吗?很抱歉有很多问题,但我在理解 ggplot 的工作原理方面遇到了一些真正的困难。谢谢!

【问题讨论】:

  • 只是一个想法:我最近有一个类似的想法来使用点图,但随后使用了一个相对简单的散点图来切换两个变量,在这种情况下,您的 y 轴和图例(点尺寸)。问题是你有两个连续变量和第三个由你的标签组成的变量。对我来说,使用散点图然后使用geom_text() 添加标签(Randy、Mark 等)更有意义。
  • @FabianHabersack 是的,实际上我首先从点图开始,然后移至散点图,但最终到了这里!我想现在我只是想看看哪一个信息量更大。也许利用这个机会最终学习了一些 ggplot 技巧。

标签: r ggplot2 bubble-chart


【解决方案1】:

只是作为考虑这个问题的另一种方式......也许它会有所帮助。 :-)

library(tidyverse)

set.seed(123)

df <- tibble(
  year = rep(2001:2005, each = 5),
  name = rep(c("John","Ellen","Mark","Randy","Luisa"),5),
  value = sample(seq(0,25,by=1),25)
)

df %>%
  mutate(name_2 = ifelse(year>2001 & year<2005, NA, name)) %>%
  ggplot(aes(year, value, group = name, label = name_2, color = name)) + 
  geom_line() +
  geom_point() +
  geom_text(vjust = -1) +
  scale_color_brewer(palette = "Set1") +
  theme_minimal(base_family = "serif") +
  theme(legend.position = "none") +
  xlab("")

【讨论】:

  • 感谢您的建议!事实是我试图模仿类似的东西(maartenlambrechts.com/assets/dotplot_eurostat.png),只是意识到用我的数据可能是不可能的。我喜欢你的图(我肯定应该开始使用 tidyverse),但实际上我不想显示趋势,也许这些线条代表了一种过剩的信息。但我会检查出来!
【解决方案2】:

为了将数据中的变量映射到某种规模,您可以使用aes() 函数将 ggplot2 所谓的“美学”与表达式(通常是数据中列的符号)结合起来。因此,要制作色标,您必须在 aes() 函数内指定 colour 美学。在下面的代码中,我还指定了 alpha 美学,如果 Value &gt; 0 为 1,否则为 0,使 0 值点完全透明。我指定 I() 让 ggplot2 知道它应该按字面意思获取该值,而不是将其映射到比例。

library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 4.0.3

Year<-rep(2001:2005, each = 5)
name<-c("John","Ellen","Mark","Randy","Luisa")
Name<-c(rep(name,5))
Value<-sample(seq(0,25,by=1),25)
mydata<-data.frame(Year,Name,Value)

g <- ggplot(mydata, aes(x=Year, y=Name, size = Value)) +
  geom_point(aes(colour = Value, 
                 alpha = I(as.numeric(Value > 0))))

一旦我们指定了美学,我们就可以开始自定义比例了。典型的模式是scale_{the aesthetic}_{type of scale},所以如果我们想将颜色值映射到绿色刻度,我们需要添加scale_colour_viridis_c()*_c是连续刻度)。在比例尺中,我们可以指定例如限制,您指定的范围应该在 1 到 25 之间。另外,我添加了一个 scale_size_area(),我们说我们不希望通过设置来表示点大小的图例`guide = "none"。

g + scale_colour_viridis_c(option = "C", direction = -1,
                         limits = c(1, 25)) +
  scale_size_area(guide = "none") +
  theme(axis.line = element_blank(),
        axis.text.x=element_text(size=11,margin=margin(b=10),colour="black"),
        axis.text.y=element_text(size=13,margin=margin(l=10),colour="black",
                                 face="italic"),
        axis.ticks = element_blank(),
        axis.title=element_text(size=18,face="bold"),
        panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        legend.text = element_text(size=14),
        legend.title = element_text(size=18))

reprex package (v1.0.0) 于 2021 年 2 月 24 日创建

【讨论】:

  • 非常感谢,这实际上是我喜欢的答案(并且效果很好)。并且感谢您对每一点的解释,现在肯定更清楚了!我喜欢你首先设置一般审美,然后传递到单一尺度。
【解决方案3】:

这就是你要找的吗?

library(ggplot2)

Year<-rep(2001:2005, each = 5)
name<-c("John","Ellen","Mark","Randy","Luisa")
Name<-c(rep(name,5))
Value<-sample(seq(0,25,by=1),25)
Value <- ifelse(Value == 0, NA, Value)
mydata<-data.frame(Year,Name,Value)

ggplot(mydata, aes(x=Year, y=Name, size = Value, colour = Value)) +
  geom_point() +
  scale_colour_viridis_c() +
  scale_size(guide = F) +
  theme(axis.line = element_blank(),
        axis.text.x=element_text(size=11,margin=margin(b=10),colour="black"),
        axis.text.y=element_text(size=13,margin=margin(l=10),colour="black",
                                 face="italic"),
        axis.ticks = element_blank(),
        axis.title=element_text(size=18,face="bold"),
        panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        legend.text = element_text(size=14),
        legend.title = element_text(size=18))
#> Warning: Removed 1 rows containing missing values (geom_point).

关于你的观点: 我只看到了scale_colour_viridis_cscale_colour_viridis_b 函数,就我所见,它们的颜色不同。也许我错过了一些包裹?

其次,关于NAs:您只需将 0 替换为 NAs。

最后关于比例:色阶是自动连续的。连续描述尺寸有点棘手,因此它总是离散的。但是我为您从图例中删除了它,这样您就只有示例中的颜色。

【讨论】:

  • 我实际上刚刚发现_c_d_b 的不同用法:显然,区别在于离散、连续或连续(但绑定)数据的使用 -我还以为跟颜色有关呢! ggplot2.tidyverse.org/reference/scale_viridis.html 感谢其他两个规范,现在更清楚了。
猜你喜欢
  • 2020-08-24
  • 2017-04-30
  • 2018-09-15
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2018-10-13
  • 2015-03-19
  • 1970-01-01
相关资源
最近更新 更多