【问题标题】:Graphing Segments in RR中的图形段
【发布时间】:2017-02-12 20:32:33
【问题描述】:

我想在 R 中绘制分段数据。也就是说,我有以下形式的数据

| Product               | Date   | Origination | Rate | Num | Balance   |
|-----------------------|--------|-------------|------|-----|-----------|
| DEMAND DEPOSITS       | 200505 | 198209      | 0    | 1   | 2586.25   |
| DEMAND DEPOSITS       | 200505 | 198304      | 0    | 1   | 3557.73   |
| DEMAND DEPOSITS       | 200505 | 198308      | 0    | 1   | 14923.72  |
| DEMAND DEPOSITS       | 200505 | 198401      | 0    | 1   | 4431.67   |
| DEMAND DEPOSITS       | 200505 | 198410      | 0    | 1   | 44555.23  |
| MONEY MARKET ACCOUNTS | 200505 | 198209      | 0.25 | 2   | 65710.01  |
| MONEY MARKET ACCOUNTS | 200505 | 198211      | 0.25 | 2   | 41218.41  |
| MONEY MARKET ACCOUNTS | 200505 | 198304      | 0.25 | 1   | 61421.2   |
| MONEY MARKET ACCOUNTS | 200505 | 198402      | 0.25 | 1   | 13620.17  |
| MONEY MARKET ACCOUNTS | 200505 | 198408      | 0.75 | 1   | 281897.74 |
| MONEY MARKET ACCOUNTS | 200505 | 198410      | 0.25 | 1   | 5131.33   |
| NOW ACCOUNTS          | 200505 | 198209      | 0    | 1   | 142744.35 |
| NOW ACCOUNTS          | 200505 | 198303      | 0    | 1   | 12191.6   |
| SAVING ACCOUNTS       | 200505 | 198301      | 0.25 | 1   | 96936.24  |
| SAVING ACCOUNTS       | 200505 | 198302      | 0.25 | 2   | 21764     |
| SAVING ACCOUNTS       | 200505 | 198304      | 0.25 | 1   | 14646.55  |
| SAVING ACCOUNTS       | 200505 | 198305      | 0.25 | 1   | 20909.7   |
| SAVING ACCOUNTS       | 200505 | 198306      | 0.25 | 1   | 66434.56  |
| SAVING ACCOUNTS       | 200505 | 198309      | 0.25 | 1   | 20005.56  |
| SAVING ACCOUNTS       | 200505 | 198404      | 0.25 | 2   | 16766.56  |
| SAVING ACCOUNTS       | 200505 | 198407      | 0.25 | 1   | 47721.97  |

我想在 Y 轴上按“余额”为每个“产品”类型绘制一条线。在 X 轴上,我想放置“起源”。理想情况下,我还想设置颜色来区分线条。数据当前不在 data.frame 形式中,所以如果我需要改回该形式,请告诉我。

尽管我确定有,但我无法在网上找到信息丰富的解决方案。

谢谢,

【问题讨论】:

  • 请制作数据reproducible 并展示一些代码工作,您尝试过什么失败了。

标签: r plot segment


【解决方案1】:

正如@zx8754 提到的,您应该提供可重现的数据。 在没有测试代码的情况下(因为没有可重现的数据),我建议如下,假设数据在 data.frame 'data' 中:

all_products <- unique(data$Product)
colors_use <- rainbow(length(all_products))

plot(y = data[data$Product == all_products[1],"Balance"],
    x = data[data$Product == all_products[1],"Origination"],
    type = "l",
    col = colors_use[1],
    ylim = c(min(data$Balance, na.rm = T),max(data$Balance, na.rm = T)),
    xlim = c(min(data$Origination, na.rm = T),max(data$Origination, na.rm = T)))

for(i_product in 2:length(all_products)){
    lines(y = data[data$Product == all_products[i_product],"Balance"],
        x = data[data$Product == all_products[i_product],"Origination"],
        col = colors_use[i_product])
}

【讨论】:

  • 这是一个很好的解决方案,可以使用许多不同的产品。彩虹功能的使用很巧妙。谢谢,我很感激。
【解决方案2】:

我没有足够的声誉来发表评论,所以我写它作为答案。为了使@tobiasegli_te 的答案更短,第一个plot 可以是plot(Balance~Origination,data=data,type='n'),然后为i_product in 1:length(all_products) 完成后续lines。这样你就不用担心ylim。这是使用 Grunfeld 数据的示例。

z <- read.csv('http://statmath.wu-wien.ac.at/~zeileis/grunfeld/Grunfeld.csv')
plot(invest~year,data=z,type='n')
for (i in unique(as.numeric(z$firm))) lines(invest~year,data=z,
    subset=as.numeric(z$firm)==i, col=i)

另请注意,您的Origination 的间距不相等。您需要将其更改为 Date 或类似名称。

【讨论】:

    【解决方案3】:

    我猜你想要类似下面的东西:

    df <- as.data.frame(df[c('Product', 'Balance', 'Origination')])
    head(df)
    
    Product  Balance Origination
    1  DEMAND DEPOSITS         2586.25      198209
    2  DEMAND DEPOSITS         3557.73      198304
    3  DEMAND DEPOSITS        14923.72      198308
    4  DEMAND DEPOSITS         4431.67      198401
    5  DEMAND DEPOSITS        44555.23      198410
    6  MONEY MARKET ACCOUNTS  65710.01      198209
    
    library(ggplot2)
    library(scales)
    ggplot(df, aes(Origination, Balance, group=Product, col=Product)) + 
             geom_line(lwd=1.2) + scale_y_continuous(labels = comma) 
    

    【讨论】:

    • 太棒了。这很有效,而且非常简单。我最终不得不重新启动 R 以使其正常工作。谢谢。
    【解决方案4】:

    我不确定你想要什么,那是你想要的吗?

    假设您将数据放在 data.txt 中,删除管道并将名称中的空格替换为“_”

    d = read.table("data.txt", header=T)
    
    prod.col = c("red", "blue", "green", "black" )
    prod = unique(d$Product)
    
    par(mai = c(0.8, 1.8, 0.8, 0.8))
    plot(1, yaxt = 'n', type = "n", axes = TRUE, xlab = "Origination", ylab = "", xlim = c(min(d$Origination), max(d$Origination)), ylim=c(0, nrow(d)+5) )
    axis(2, at=seq(1:nrow(d)), labels=d$Product, las = 2, cex.axis=0.5)
    mtext(side=2, line=7, "Products")
    
    for( i in 1:nrow(d) ){
    myProd = d$Product[i]
    myCol = prod.col[which(prod == myProd)]
    myOrig  = d$Origination[i]
    segments( x0 = 0, x1 = myOrig, y0 = i, y1 = i, col = myCol, lwd = 5 )
    }
    legend( "topright", col=prod.col, legend=prod, cex=0.3, lty=c(1,1), bg="white" )
    

    【讨论】:

    • 这是一个非常巧妙的情节。不完全是我想要的。它是按起始日期构建产品余额的时间序列。但这种绘图技术在未来肯定会派上用场。谢谢。
    • 接下来的问题,不要犹豫,手绘一张你想要的草图,一张图值千言万语;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2015-01-15
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多