【问题标题】:Plot only specific dataframe rows that matches a criteria in R仅绘制与 R 中的条件匹配的特定数据帧行
【发布时间】:2021-05-20 23:21:17
【问题描述】:

我有一个这样构建的数据框:

       Id        Client           data     
        1           5             25     
        2           8             63       
        3          13             42
        4           5             87
        5           8             35

还有一个数组:clients <- c(5,8)

我需要为“clients”数组中的每个客户端绘制不同的直方图(数据列)。在此示例中,我将为客户端 5 绘制直方图,其中包含两个条 (25,87),而客户端 8 的一个直方图也包含两个条 (63,35)。我认为我需要使用 facet_wrap 函数为每个客户端绘制直方图,我还尝试为每个客户端做类似的绘图,但没有奏效。我不确定我该怎么做,所以任何帮助都会很棒!

【问题讨论】:

    标签: r plot histogram


    【解决方案1】:

    看来您只是没有进行足够的数据整理。此外,根据您的描述,您需要 barplot,而不是直方图(它会报告数据中特定值的计数,而不是它们的值)。

    这是base中的解决方案。

    dt = data.frame("id" = 1:5, "client" = c(5,8,13,5,8), "data"=c(25,63,42,87,35))
    clients = c(5,8,13) # for particular clients, or unique(dt$client) for all clients
    
    # get data for every client
    lst = lapply(clients, function(x){dt[dt$client == x, "data"]})
    
    # unify length and transform into a matrix
    len = max(sapply(lst, length))
    mat = do.call(cbind, lapply(lst, "[", seq_len(len)))
    
    # Put some nice legend
    colnames(mat) = paste("Client", clients)
    
    # plot this matrix with barplot
    barplot(mat, beside=TRUE, las=1)
    

    【讨论】:

    • 它说“找不到函数 sel_len”
    • @JediJesus 我最初打错了,但已经解决了这个问题。请重试代码。
    • 另一个答案更像是我需要的,它给了我一个更漂亮的情节我是一个更简单的方法,但感谢你的回答,它也有效!
    【解决方案2】:

    如果clients 的数量有限,您可以在同一图表上绘制。

    library(dplyr)
    library(ggplot2)
    
    df %>%
      filter(Client %in% clients) %>%
      group_by(Client) %>%
      mutate(Id = factor(row_number())) %>%
      ggplot() + aes(Client, data, fill = Id) + 
      geom_bar(stat = 'identity', position = 'dodge')
    

    带有刻面:

    df %>%
      filter(Client %in% clients) %>%
      group_by(Client) %>%
      mutate(Id = factor(row_number())) %>%
      ggplot() + aes(Client, data, fill = Id) + 
      geom_bar(stat = 'identity', position = 'dodge') + 
      facet_wrap(~Client, scales = 'free_x')
    

    数据

    df <- structure(list(Id = 1:5, Client = c(5L, 8L, 13L, 5L, 8L), data = c(25L, 
    63L, 42L, 87L, 35L)), class = "data.frame", row.names = c(NA, -5L))
    
    clients <- c(5,8)
    

    【讨论】:

    • 在这种情况下,我的数据是“时间”格式的分钟,因此我收到了一个错误,你知道我该如何解决吗?
    • 这个colors(Id)是基于行数的吗?没看懂
    • 默认的ggplot2 图表确实令人困惑,以至于根本不适合。图例毫无意义,缺少对客户端的描述(哦,它在那里,但在对面!),x 轴无用到误导的程度,而且字体很小。不要减损@RonakShah 的回答,外观当然可以改进(base::barplot 的输出也可以),这更令人惊讶,因为ggplot 经常被誉为最好的 R 图形工具包,尤其是在默认设置方面.
    • @JediJesus 你得到什么错误?你能分享你的实际数据框的样本吗?是的id 是基于行数,也许它需要一个更好的名称来澄清。
    • @RonakShah o 通过将数据帧字段转换为数字来修复错误。我想做点什么... Y 轴的值对于每个图(带有刻面的图)都是相同的,我可以得到一个图,其中每个刻面都有自己的轴值吗?我想要这个,因为并非每个客户的所有数据都相似,因此,一些客户的门槛很低。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多