在R中排列4个plotly饼图

3

我有四张独立的饼图,它们都使用相同指定的颜色方案(代码除了数据框不同其他都一样)。

这些颜色是指定的,因为我想要将它们合并在一个4×4的图中,并使用相同的指定颜色为每个五组进行颜色标注(即当没有指定颜色时,颜色会根据组大小自动分配)。

示例数据:

# Data
g = c("D","L","X","A","N","B")
v = c(49,14,9,7,6,5)

df1 = data.frame(group = g, value = v)
set.seed(9) # Just for reproductibility
df2 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
                 )

set.seed(8) 
df3 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
)

set.seed(7)
df4 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
)

饼图数据

代码:

BC <- 

       plot_ly(b_c, labels = ~group, values = ~value, marker = list(colors = c(  '#2ca02c',  '#d62728','#9467bd', '#FF7F0E', '#1F77B4')), type = 'pie',textposition = 'outside',textinfo = 'label+percent') %>%
       layout(title = 'b_c',autosize = F, width = 690, height = 690, margin = m,
              xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
              yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
     BC   

我已经阅读了这些帖子,但是没有找到一个能够结合这些图形的答案。

在R Plotly中部署子图

在plotly中绘制多个饼图

我正在寻找类似于ggplot中的ggarrange的东西。

我有四组数据,其中一些具有相同的分组(即相同的行名称)。 对于这些,我想使用相同的颜色。

我并不在乎颜色方案(即可以是任何颜色),但希望为所有4个饼状图使用统一的颜色图例。


2
能否提供一些数据,@sar?如果可能的话,还请提供绘图的草图以及现在的样子。 - vpz
嗯,我在另一台电脑上打开了这个文件,现在出现了错误。在layout()中指定宽度/高度已经被弃用了。 请在ggplotly()或plot_ly()中指定。 - anon
@vpz 我已经添加了数据示例。我想把这4个饼图排列成一个2x2的方格,并显示一个图例,以展示相同组别的相同颜色。 - anon
1
我添加了一个答案建议。这对你有帮助吗? - vpz
1个回答

6

嗨@sar,请看一下是否解决了你的问题:

library(plotly)
library(dplyr)

# Data
g = c("D","L","X","A","N","B")
v = c(49,14,9,7,6,5)

df1 = data.frame(group = g, value = v)
set.seed(9) # Just for reproductibility
df2 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
                 )

set.seed(8) 
df3 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
)

set.seed(7)
df4 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
)


#Plot

plot_ly(labels = ~group, values = ~value, legendgroup = ~group,
        textposition = 'outside',textinfo = 'label+percent') %>%
  add_pie(data = df1, name = "DF1", domain = list(row = 0, column = 0))%>%
  add_pie(data = df2, name = "DF2", domain = list(row = 0, column = 1))%>%
  add_pie(data = df3, name = "DF3", domain = list(row = 1, column = 0))%>%
  add_pie(data = df4, name = "DF4", domain = list(row = 1, column = 1))%>%
  layout(title = "Pie Charts in Grid", showlegend = T,
         grid=list(rows=2, columns=2),
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))


输出:

plot

编辑1: 要在每个饼状图中显示“字幕”,您可以使用 注释,还可以更改 图例 位置。注释的缺点是必须指定位置(在此情况下为手动)。
为了避免重叠,建议删除textposition ='outside'
您可以使用绘图右上角的按钮将绘图下载为.png文件。
#Plot

plot_ly(labels = ~group, values = ~value, legendgroup = ~group, 
        textinfo = 'label+percent') %>%
  add_pie(data = df1, name = "DF1", domain = list(row = 0, column = 0))%>%
  add_pie(data = df2, name = "DF2", domain = list(row = 0, column = 1))%>%
  add_pie(data = df3, name = "DF3", domain = list(row = 1, column = 0))%>%
  add_pie(data = df4, name = "DF4", domain = list(row = 1, column = 1))%>%
  layout(title = "Pie Charts in Grid", showlegend = T,
         grid=list(rows=2, columns=2),
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         legend = list(y = 0.5),
         annotations = list(x = c(.08, .62, .08, .62),
                            y = c(.78, .78, .22, .22),
                            text = c("Pie 1","Pie 2","Pie 3","Pie 4"),
                            xref = "papper",
                            yref = "papper",
                            showarrow = F
                          )
         )

新的输出为: plot2 编辑2: 看一下字体文本字体
您可以使用模板自由更改文本和悬停文本。
这是一个编辑建议,去掉标签以获得更多百分比空间,并将百分比四舍五入到1位小数:
#Plot

plot_ly(labels = ~group, values = ~value, legendgroup = ~group, textinfo = 'label+percent',
        texttemplate = "%{percent:.1%}",
        hovertemplate = "%{label} <br> %{percent:.1%} <br> %{value}") %>%
  add_pie(data = df1, name = "DF1", domain = list(row = 0, column = 0))%>%
  add_pie(data = df2, name = "DF2", domain = list(row = 0, column = 1))%>%
  add_pie(data = df3, name = "DF3", domain = list(row = 1, column = 0))%>%
  add_pie(data = df4, name = "DF4", domain = list(row = 1, column = 1))%>%
  layout(title = "Pie Charts in Grid", showlegend = T,
         grid=list(rows=2, columns=2),
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         legend = list(y = 0.5),
         annotations = list(x = c(.08, .62, .08, .62),
                            y = c(.78, .78, .22, .22),
                            text = c("Pie 1","Pie 2","Pie 3","Pie 4"),
                            xref = "papper",
                            yref = "papper",
                            showarrow = F
                          )
         )

新输出:

plot3


1
嗨@sar,我刚刚进行了一次编辑。希望它能对你有所帮助。 - vpz
1
我真的不知道如何添加脚注并省略低百分比组。但您可以根据需要调整文本格式和悬停文本格式。请查看编辑2。 - vpz
1
嗨@sar 抱歉,我不明白你所说的“线条已经超出图表范围”的意思,你可以在评论中放一张图片吗?对于图例,其位置可以在代码行“legend = list(...)”中进行调整。我相信您也可以在那里调整图例的“文本字体”。 - vpz
1
@sar 另一种保存图像的解决方案是在控制台上运行代码并在Viwer窗格中生成绘图(通常位于Rstudio右下角)。然后单击“导出”并将图像保存为.PNG。在那里,您可以手动指定尺寸。 - vpz
1
你试过扩大 fig.widthfig.height 吗? - vpz
显示剩余16条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接