【问题标题】:Arrange 4 plotly pie graphs in R在 R 中排列 4 个 plotly 饼图
【发布时间】:2020-04-27 13:34:34
【问题描述】:

我有四个单独的饼图,它们都具有相同的指定配色方案(除了数据框之外,代码是相同的)。

颜色是指定的,因为我想将它们组合在 4 个网格图中与一个图例,为 5 个组中的每一个使用相同的指定颜色(即,当未指定颜色时,颜色会根据组的大小)。

示例数据:

# 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   

我已经查看了这些帖子,但无法确定从这些帖子中梳理情节的答案。

Subplots deploying in R Plotly

Plotting multiple pie charts in plotly

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

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

我并不介意配色方案(即可以是任何颜色),但希望为所有 4 个图形图提供一个统一的颜色图例。

【问题讨论】:

  • 你能提供一些数据@sar 吗?如果可能的话,画出情节的样子和现在的样子。
  • 嗯,我已经在另一台计算机上打开了它,现在我收到了这个错误。现在不推荐在 layout() 中指定宽度/高度。请在 ggplotly() 或 plot_ly() 中指定
  • @vpz 我添加了数据示例。我想将 4 个 piegraphs 排列在一个 2x2 的正方形中,其中一个图例为相同的组显示相同的颜色
  • 我添加了一个答案建议。对你有帮助吗?

标签: r ggplot2 plotly legend pie-chart


【解决方案1】:

嗨@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))

输出:

EDIT1: 要为每个饼图显示“字幕”,您可以使用annotations,也可以更改legend 的位置。注释的缺点是您必须指定位置(在这种情况下是手动)。

为避免重叠,我建议删除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
                          )
         )

新的输出是:

EDIT2: 看看fonttext font

您可以使用template 随意更改文本和悬停文本。

这里有一个编辑建议去掉标签以获得更多空间用于百分比和四舍五入到 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
                          )
         )

新输出:

【讨论】:

  • 嗨@sar 我现在进行了编辑。希望对你有帮助
  • 我真的不知道你应该把脚注和省略低百分比的组。但是您可以随意调整文本格式和悬停文本格式。看看编辑 2
  • 嗨@sar 抱歉,我不明白您所说的“线条超出图表”是什么意思,您可以在 cmets 中放一张图片吗?对于图例,可以在代码legend = list(...) 的行中调整位置。我相信你也可以为那里的传说调整text font
  • @sar 另一种保存图像的解决方案是在控制台上运行代码并在 Viwer 窗格中生成绘图(Tipicaly 在 Rstudio 的右下角)。然后单击Export 并将图像另存为.PNG。在那里您可以手动指定尺寸
  • 修改标签的其他方法是在每个 data.frame 中使用所需的标签构建另一列。类似:df1 = df1 %&gt;% mutate(new_lab = case_when(...))
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2018-03-17
  • 2017-03-02
  • 2019-06-23
相关资源
最近更新 更多