【问题标题】:Plotting n columns of a data frame as lines with ggplot in r在 r 中使用 ggplot 将数据框的 n 列绘制为线
【发布时间】:2018-10-28 20:21:20
【问题描述】:

我正在尝试使用 ggplot 在 R 中重新创建 Pólya 骨灰盒模型 (https://en.wikipedia.org/wiki/Pólya_urn_model)。该模型基本上从“瓮”中的 1 个白球和 1 个黑球开始,然后随机选择一个球并将其与一个相同颜色的球重新组合在一起。我在 R 中执行此操作,例如 10 次迭代(因此 10 次取出一个球并将其与另一个相同颜色的球放回一起)。我运行这个说 5 次。因此,我得到一个 5 列(= 每次运行)和 10 行(= 迭代)的数据框。

What I want is to illustrate is this 但是这张照片显然有更多的试验和迭代。

到目前为止,我所拥有的是一个数据框,其中每一列是每次试验/运行时瓮中白球的比例,我想说明每次迭代的比例如何变化。而且我想为每次运行单独显示这个,所以每次运行我都希望有不同的颜色。

我查看了无数类似的问题,但没有找到答案。我认为这是因为我的数据框现在有 5 列但是当我重塑它时我只得到一列的比例并且在每列旁边我得到一个代码说明它属于哪一列 - 但在这种情况下 ggplot 只绘制一个4 种颜色的线。

my data frame looks like this:
          V1         V2         V3        V4 id
1  0.3333333 0.33333333 0.33333333 0.3333333  1
2  0.5000000 0.25000000 0.25000000 0.2500000  2
3  0.4000000 0.20000000 0.20000000 0.4000000  3
4  0.3333333 0.16666667 0.16666667 0.3333333  4
5  0.2857143 0.14285714 0.14285714 0.2857143  5
6  0.2500000 0.12500000 0.12500000 0.3750000  6
7  0.2222222 0.11111111 0.11111111 0.3333333  7
8  0.2000000 0.10000000 0.10000000 0.3000000  8
9  0.1818182 0.09090909 0.09090909 0.2727273  9
10 0.2500000 0.08333333 0.08333333 0.2500000 10

但为了更容易,这里有一些测试代码:

V1 <- rnorm(10, 0.5, 0.1)
V2 <- rnorm(10, 0.5, 0.1)
V3 <- rnorm(10, 0.5, 0.1)
V4 <- rnorm(10, 0.5, 0.1)
df <- data.frame(V1, V2, V3, V4)

我的 ggplot 代码如下:

library(reshape2)
df$id = row.names(df) # add id to each row 
df_long = melt(df, id.vars = "id")  # reshape the data into long format

第一个版本只描述了点

ggplot(df_long, aes(x = value, y = id, color = variable)) + 
geom_point() 

而且这个版本不知何故把台词“搞砸了”,我不知道为什么。

ggplot() + geom_line(data = df_long, aes(x = value, y = id, color = variable, group = variable)) + xlab("x axis") +  ylab("y axis")

任何帮助都将不胜感激,我已经为此苦苦挣扎了好几天,到目前为止还没有取得任何重大突破。

编辑:“搞砸”我的意思是,不是每次运行都绘制一条线(我想得到),而是数据点似乎丢失了它们所属的试验/运行。因此,我不是每次运行/试验都得到一条线,而是得到更多的线,其中一些只连接 2-3 个点,并且经常连接来自不同运行的点。我希望我的解释足够清楚。

【问题讨论】:

  • 你能定义'messed up'吗?我看到一个图表,每个值 variableV1V4 都有一条线。

标签: r dataframe ggplot2


【解决方案1】:

如果我理解正确的话,这似乎可以正确连接所有这些。请检查这是否正确。

df$id = 1:nrow(df)
final_data <- melt(df, id='id')
names(final_data) <- c('id', 'func', 'value')

ggplot() + geom_line(data = final_data, aes(x = id, y = value, color = func, group = func), size = 1)

输出:

          V1        V2        V3        V4 id
1  0.4656275 0.4846357 0.4613710 0.5885883  1
2  0.4312952 0.4929042 0.5499502 0.5133333  2
3  0.5890201 0.4652452 0.5598206 0.4789956  3
4  0.7108441 0.4143140 0.5738660 0.4073124  4
5  0.6374072 0.6671785 0.5111608 0.4475132  5
6  0.4797948 0.6191391 0.5423101 0.4472512  6
7  0.5868793 0.5601147 0.4369428 0.5696494  7
8  0.5169970 0.4398982 0.5137524 0.3923140  8
9  0.3960616 0.3552303 0.4174657 0.4449402  9
10 0.5222120 0.5028562 0.5760920 0.4310323 10

【讨论】:

    【解决方案2】:

    使用您的df,您可以执行以下操作:

    library(tidyverse)
    
    # I use 'gather' instead of 'melt'
    df_long = df %>% 
      mutate(id = 1:nrow(.)) %>% 
      gather(id.vars, values, -id) 
    
    df_long %>% 
      ggplot(aes(x = values, y = id, group = id.vars, color = id.vars)) + 
      geom_line(size = 1) 
    

    ]

    观察:

    如果您是set.seed(...),我们可以复制您的df 对象。

    【讨论】:

    • 谢谢!虽然我不得不稍微改变它,因为由于某种原因需要改变两个轴的值(所以:x = id,y = 值)但最终它可以工作,所以这很重要。
    • 太棒了@Ron
    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 2017-07-02
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多