【问题标题】:How to make an R plot with values on x-axis values not in order如何使用不按顺序排列的 x 轴值制作 R 图
【发布时间】:2021-12-03 06:15:11
【问题描述】:

我有以下示例数据框,想要绘制列 b(x 轴)和 d(y 轴),但基于列 a。这意味着我希望 bd 中与 a 列中的值 1 对应的行绘制在旁边彼此(作为点或垂直线),然后类似地用于列 a 中的值 2 等(都在一个图中)。

我无法执行此操作,因为这意味着 x 轴上的值会增加和减少/波动。

a <- c(1,1,1,1,1,1,1, 2,2,2,2,2,2,2, 3,3,3,3,3,3,3)
b <- c(1,4,5,7,8,10,13, 5,7,10,11,14,17,23, 3,7,11,16,19,26,29)
d <- c(.4,.15,.76,.07,.18,.11,.12, .23,.45,.25,.11,.16,.2,.5, .48,.9,.13,.75,.4,.98,.3)

df <- data.frame("a" = a, "b" = b, "d" = d)

plot(df$b, df$d)

我已经尝试了如上所示的基本绘图(不是我想要的结果)并尝试了其他方法来重新标记 x 轴上的值,但这也是不正确的。

最后,我无法使用任何 R 库,因为我无法将它们下载到我正在使用的计算机上。

提前感谢您的帮助!

【问题讨论】:

    标签: r dataframe plot


    【解决方案1】:

    不确定我是否正确理解了这个问题,但也许绘制“a”和“b”的交互会起作用?

    a <- c(1,1,1,1,1,1,1, 2,2,2,2,2,2,2, 3,3,3,3,3,3,3)
    b <- c(1,4,5,7,8,10,13, 5,7,10,11,14,17,23, 3,7,11,16,19,26,29)
    d <- c(.4,.15,.76,.07,.18,.11,.12, .23,.45,.25,.11,.16,.2,.5, .48,.9,.13,.75,.4,.98,.3)
    
    df <- data.frame("a" = a, "b" = interaction(b, a), "d" = d)
    df$b <- factor(df$b, levels = df$b)
    
    png("test.png", width = 900, height = 400, units = "px")
    plot(df$b, df$d)
    dev.off()
    

    编辑

    或者也许删除 x 轴标签并“手动”添加它们?

    a <- c(1,1,1,1,1,1,1, 2,2,2,2,2,2,2, 3,3,3,3,3,3,3)
    b <- c(1,4,5,7,8,10,13, 5,7,10,11,14,17,23, 3,7,11,16,19,26,29)
    d <- c(.4,.15,.76,.07,.18,.11,.12, .23,.45,.25,.11,.16,.2,.5, .48,.9,.13,.75,.4,.98,.3)
    
    df <- data.frame("a" = a, "b" = b, "d" = d)
    
    png("test.png", width = 900, height = 400, units = "px")
    plot(seq_along(df$b), df$d, xaxt = "none")
    axis(1, at = seq_along(df$b), labels = df$b)
    dev.off()
    

    编辑 2

    另一种可能更好地“保留 x 轴间距”的方法是拆分数据框并分别绘制每个组:

    a <- c(1,1,1,1,1,1,1, 2,2,2,2,2,2,2, 3,3,3,3,3,3,3)
    b <- c(1,4,5,7,8,10,13, 5,7,10,11,14,17,23, 3,7,11,16,19,26,29)
    d <- c(.4,.15,.76,.07,.18,.11,.12, .23,.45,.25,.11,.16,.2,.5, .48,.9,.13,.75,.4,.98,.3)
    
    df <- data.frame("a" = a, "b" = b, "d" = d)
    
    split_df <- split(df, df$a)
    
    par(mfrow = c(1, 3), mar = c(2, 2, 1, 1))
    plot(split_df$`1`$b, split_df$`1`$d, ylim = c(0, 1))
    plot(split_df$`2`$b, split_df$`2`$d, ylim = c(0, 1))
    plot(split_df$`3`$b, split_df$`3`$d, ylim = c(0, 1))
    

    reprex package (v2.0.1) 于 2021 年 10 月 15 日创建

    【讨论】:

    • 我已经包含了一个可视化,可能有助于进一步解释我的问题 (imgur.com/bgcigfP)。我想分组绘制,其中每个组由“a”中的值分隔。因此,“b”和“d”中与“a”中的 1 相对应的前 7 个值被绘制,然后在“b”和“d”中对应于“a”中的 2 的接下来的 7 个值被绘制,等等. 但这意味着 x 轴上的值会波动很大。我希望这更有帮助。另外,如果我“手动”标记 x 轴,那不会保留 col“b”中值的间距吗?
    • 我编辑了我的答案 - 这更接近你想要做的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多