在 R 中添加颜色和气泡大小图例

Posted

技术标签:

【中文标题】在 R 中添加颜色和气泡大小图例【英文标题】:Adding color and bubble size legend in R plotly 【发布时间】:2018-06-10 17:23:55 【问题描述】:

可能很简单。

我有一个 xy 数据集,我想使用Rplotly 进行绘图。以下是数据:

set.seed(1)
df <- data.frame(x=1:10,y=runif(10,1,10),group=c(rep("A",9),"B"),group.size=as.integer(runif(10,1,10)))

我想用df$group 为数据着色,并让点的大小跟随df$group.size(即气泡图)。另外,我想同时添加这两个图例。

这是我天真的尝试:

require(plotly)  
require(dplyr)  

    main.plot <-
 plot_ly(type='scatter',mode="markers",color=~df$group,x=~df$x,y=~df$y,size=~df$group.size,marker=list(sizeref=0.1,sizemode="area",opacity=0.5),data=df,showlegend=T) %>%
     layout(title="Title",xaxis=list(title="X",zeroline=F),yaxis=list(title="Y",zeroline=F))

结果如下:

不幸的是,这个图例搞砸了,至少我希望它是这样的:每个组的一个点具有相同的大小但颜色不同。

然后为我关注this的group.size添加图例,也得到了aocall的回答:

legend.plot <- plot_ly() %>% add_markers(x = 1, y = unique(df$group.size),
                                size = unique(df$group.size),
                                showlegend = T, 
                                marker = list(sizeref=0.1,sizemode="area")) %>%
   layout(title="TITLE",xaxis = list(zeroline=F,showline=F,showticklabels=F,showgrid=F),
          yaxis=list(showgrid=F))

结果如下:

我的问题是图例包含我的数据中不存在的值。

然后我使用subplot 组合它们:

subplot(legend.plot, main.plot, widths = c(0.1, 0.9))

我明白了:

图例标题被删除的地方

所以我会提供一些帮助。

【问题讨论】:

你见过这个吗? ***.com/questions/47383244/… 试过并相应地更新了我的问题 【参考方案1】:

根据更新的请求:

注意legend.plot 的变化(将值映射到整数序列,然后手动更改轴刻度文本),以及使用注释获取图例标题。正如in this answer 解释的那样,无论使用多少个子图,都只能使用一个标题。

图例上的圆圈似乎对应于每条迹线的最小点大小。因此,我在 (12, 12) 处添加了一个点,并限制了轴的范围以确保它不显示。

titleXtitleY 控制轴标签的显示,如here 所述。

set.seed(1)
df <- data.frame(x=1:10,y=runif(10,1,10),group=c(rep("A",9),"B"),group.size=as.integer(runif(10,1,10)))
require(plotly)  
require(dplyr)  


## Take unique values before adding dummy value
unique_vals <- unique(df$group.size)
df <- rbind(c(12, 12, "B", 1), df)
df[c(1, 2, 4)] <- lapply(df[c(1, 2, 4)], as.numeric)


main.plot <-
  plot_ly(type='scatter',
    mode="markers",
    color=~df$group,
    x=~df$x,
    y=~df$y,
    size=~df$group.size,
    marker=list(
        sizeref=0.1,
        sizemode="area",
        opacity=0.5),
        data=df,
        showlegend=T) %>%
  layout(title="Title",
    xaxis=list(title="X",zeroline=F, range=c(0, 11)),
    yaxis=list(title="Y",zeroline=F, range=c(0, 11)))

legend.plot <- plot_ly() %>% 
    add_markers(x = 1, 
    y = seq_len(length(unique_vals)),
    size = sort(unique_vals),
    showlegend = F, 
    marker = list(sizeref=0.1,sizemode="area")) %>%
    layout(
        annotations = list(
            list(x = 0.2, 
                y = 1, 
                text = "LEGEND TITLE", 
                showarrow = F, 
                xref='paper', 
                yref='paper')),
         xaxis = list(
            zeroline=F,
            showline=F,
            showticklabels=F,
            showgrid=F),
         yaxis=list(
            showgrid=F,
            tickmode = "array",
            tickvals = seq_len(length(unique_vals)),
            ticktext = sort(unique_vals)))


subplot(legend.plot, main.plot, widths = c(0.1, 0.9), 
    titleX=TRUE, titleY=TRUE)

【讨论】:

再次感谢。 main.plot 的图例周围仍然有蓝色圆圈。你注意到了吗? 另一个问题是图例消除了轴标签【参考方案2】:

首先,您只是将唯一值传递给图例。如果您传入所有可能的值(即seq(min(x), max(x), by=1),或者在本例中为seq_len(max(x))),则图例将显示整个范围。

其次,marker 参数中的sizerefsizemode 改变了计算点大小的方式。以下示例应生成更一致的图:

set.seed(1)
df <- data.frame(x=1:10,y=runif(10,1,10),group=c(rep("A",9),"B"),group.size=as.integer(runif(10,1,10)))

require(plotly)  
require(dplyr)  

a <- plot_ly(type='scatter',mode="markers",
    color=~df$group,
    x=~df$x,
    y=~df$y,
    size=df$group.size,
    marker = list(sizeref=0.1, sizemode="area"),
    data=df,
    showlegend=F) %>%
    layout(title="Title",
        xaxis=list(title="X",zeroline=F),
        yaxis=list(title="Y",zeroline=F))

b <- plot_ly() %>% add_markers(x = 1, y = seq_len(max(df$group.size)),
    size = seq_len(max(df$group.size)), 
    showlegend = F, 
    marker = list(sizeref=0.1, sizemode="area")) %>%
    layout(
        xaxis = list(zeroline=F,showline=F,showticklabels=F,showgrid=F),
        yaxis=list(showgrid=F))


subplot(b, a, widths = c(0.1, 0.9))

【讨论】:

谢谢@aocall。我传递唯一值的原因是我不认为我的数据中不存在的圆形区域应该在图例中表示 - 我的意思是为什么图例会描述数据中不存在的特征。但似乎 plotly 无论如何都会显示这些值。对吗? 对不起,我误会了。我想这是一种品味,但我会展示所有尺寸,而不仅仅是出现的尺寸。此外,如果您想更改图例 y 轴上显示的值(仅显示唯一值),则需要对该子图进行更多自定义。 没关系。你的回答很有帮助。我编辑了集成您的代码的问题,因为还有一些我需要帮助的项目。

以上是关于在 R 中添加颜色和气泡大小图例的主要内容,如果未能解决你的问题,请参考以下文章

R数据可视化7:气泡图 Bubble Plot

R语言ggplot2可视化自定义多个图例(legend)标签之间的距离实战(例如,改变数据点颜色和数据点大小图例之间的距离)

如何使用 R studio 为每个基因设置不同的颜色并在 ChromoMap 中添加图例?

python使用matplotlib可视化为可视化图像添加图例(legend)自定义图例的字体格式字体大小字体颜色等

我们如何根据颜色标记散点图的图例

如何在ggplot气泡图中添加两个不同大小的点大小?