当前位置: 首页 > 知识库问答 >
问题:

在R中创建多个图形时,如何从group_by(dplyr)变量分配图形标题

孟思远
2023-03-14

长期读者,第一次在这里提问。

我正在使用plotly和dplyr的group_by创建多个图(group_by变量的每个级别一个图形)。

在下面的示例中,我每年创建一个绘图(group_by变量),我想将年份分配为图形标题。但是,我不知道如何使用数据帧(或tibble)中的存储值来分配标题。

任何建议都非常感谢!谢谢大家!

require(dplyr)
require(plotly)

# creating data table
d = tibble(year=rep(2016:2017,2), type=c(1,1,2,2), amount=1:4)
d

# creating 2 figures, grouped by year (one for each year).  
# Using the same title for each figure (this code works).
chart = d %>% 
  group_by(year) %>%
  do(plots = plot_ly(., values = ~amount, type = 'pie') %>% layout(title="Great Title") )

# printing first plot
chart$plots[1][[1]]

# I'd like the title of each figure to be the year.  
# I get an error when I try to assign the title with the year variable.
chart.title = d %>% 
  group_by(year) %>%
  do(plots = plot_ly(., values = ~amount, type = 'pie') %>% layout(title=year) )

共有2个答案

宦翔飞
2023-03-14

这并不复杂,因为您可以通过< code >访问本地year变量。$year,因此是通过< code >的唯一年份。$year[1](因为每个组中的< code>year是一个常数)。

但是由于重复使用了< code>%,所以会出现问题

chart = d %>% 
  group_by(year) %>%
  do(plots = layout(
    plot_ly(., values = ~amount, type = 'pie'), 
    title = paste('Chart of year', .$year[1]))
  )
chart$plots[1][[1]]
濮赤岩
2023-03-14

在tidyverse中,purrr是迭代元素的工具,也是函数式编程的助手。将purrr和嵌套data.frame与列表列相结合是一个强大的工作流程。然后你可以像group_by一样做,但它更强大。
我在某个地方读到它可以替换dplyr::do

以下是您的问题的解决方案:tidyverseway

library(dplyr, warn.conflicts = F)
library(plotly)
# for iteration and fonctionnal programming
library(purrr)
# for nesting dataframe
library(tidyr)

# creating  the data
d <- tibble(year=rep(2016:2017,2), type=c(1,1,2,2), amount=1:4)
d
#> # A tibble: 4 x 3
#>    year  type amount
#>   <int> <dbl>  <int>
#> 1  2016     1      1
#> 2  2017     1      2
#> 3  2016     2      3
#> 4  2017     2      4

当您想按年份工作时,您可以按年份嵌套数据,并有一个每年一行的tibble和一个名为data的列表列,其中每个元素都是tibble,该行是当年初始数据的子集

nested_data <- d %>% 
  nest(-year)
nested_data
#> # A tibble: 2 x 2
#>    year             data
#>   <int>           <list>
#> 1  2016 <tibble [2 x 2]>
#> 2  2017 <tibble [2 x 2]>

带有< code>map系列的< code>purrr函数允许您遍历列表。结合< code>dplyr动词,我们将添加一个包含< code>plotly图形的列。< code>map2接受两个参数,即列表列数据和列年份,并应用一个函数,我们得到一个列表,结果将存储在另一个名为plots的列表列中

charts <- nested_data %>%
  mutate(plots = map2(data, year, ~ plot_ly(.x, values = ~amount, type = 'pie') %>% layout(title = .y)))

您可以继续使用此tibble。绘图将与数据一起计算和存储。

charts
#> # A tibble: 2 x 3
#>    year             data        plots
#>   <int>           <list>       <list>
#> 1  2016 <tibble [2 x 2]> <S3: plotly>
#> 2  2017 <tibble [2 x 2]> <S3: plotly>

要手动打印绘图,您可以访问它

charts$plots[1]
#> [[1]]

您可以使用purrr遍历列表列并打印所有绘图#这将在RStudio查看器中打印绘图print_plot

总之,您可以在tidyverse生态系统中,用nestpurrr函数替换group_bydo

charts <- d %>%
  nested(- year) %>%
  mutate(plots = map2(data, year, ~ plot_ly(.x, values = ~amount, type = 'pie') %>% layout(title = .y)))
 类似资料:
  • 基本上,我有一个矩形位图,并希望创建一个新的正方形尺寸的位图,其中将包含其中的矩形位图。 因此,例如,如果源位图的宽度:100和高度:400,我想要一个宽度:400和高度:400的新位图。然后,绘制以这个新位图为中心的源位图(请参阅附加图像以更好地理解)。 我下面的代码很好地创建了方形位图,但没有将源位图绘制到其中。结果,我留下了一个完全黑色的位图。 这是代码: 知道我哪里做错了吗?

  • 我试图从顶点位置创建一组多边形,保存在X,Y格式。 下面是我的数据的一个例子——每行代表一个多边形的顶点。多边形是正方形 我正在使用,因此我的数据需要在列表中。所以我创建了一个循环来尝试从矩阵中将我的数据转换为列表格式。 我创建了一个循环,遵循我在这个网站上的其他一些问题中找到的代码。我突破了每一步,试图理解为什么我只有一个多边形作为输出,即使我有2组点。 你能帮我理解我如何调整代码写出两个多边形

  • 如何创建类似于< code > floating action button 的东西?

  • 问题可能涉及:使用boost图形库:如何通过从文件中读取边缘列表来创建图形 然而,这个答案并没有真正帮助我。 我想使用Boost的邻接列表类创建一个图。数据在一个有两列的。txt文件中。 理想的情况是,我想这样做: 类似于:www.boost.org/doc/libs/1_56_0/libs/graph/example/undirected_marcincy_list.cpp 但是,我得到一个编译

  • 主要内容:语法,示例,创建盒形图,盒形图与凹口盒形图是数据集中数据分布情况的衡量标准。它将数据集分为三个四分位数。盒形图表示数据集中的最小值,最大值,中值,第一四分位数和第四四分位数。 通过为每个数据集绘制箱形图,比较数据集中的数据分布也很有用。 R中的盒形图通过使用函数来创建。 语法 在R中创建盒形图的基本语法是 - 以下是使用的参数的描述 - x - 是向量或公式。 data - 是数据帧。 notch - 是一个逻辑值,设置为可以画出一

  • 有没有一个简单的算法可以实时使用,能够在没有任何用户输入的情况下变形两幅图像(完全自动,没有控制点可设置)? 基本上,我不想变形人脸或真实场景,这些图像实际上是完全抽象的,是绘画模式与线条等规则形状的组合。 提前谢谢。