5
df<-data.frame(adjuster=c("Mary","Mary","Bob","Bob"), date=as.Date(c("2012-1-1","2012-2-1","2012-3-1","2012-4-1")), value=c(10,15,25,15))
df
  adjuster       date value
1     Mary 2012-01-01    10
2     Mary 2012-02-01    15
3      Bob 2012-03-01    25
4      Bob 2012-04-01    15

ggplot(df,aes(x=date,y=value,color=adjuster))+geom_line()+geom_point()

ここに画像の説明を入力

上のグラフでは、2 月と 3 月のポイントがずれていることに注意してください。これらのポイントを青い線で結び、実際の 3 月のポイントを赤のままにするにはどうすればよいですか? つまり、Bob は [Jan - Mar) の値に関連付けられ、Mary は [Mar-Apr] の値に関連付けられる必要があります。

編集:私の例は非常に単純であることが判明しました。記載されている回答は、アジャスターが 2 人の間で複数回変わる場合には一般化されません。たとえば、

df<-data.frame(adjuster=c("Mary","Mary","Bob","Bob","Mary"), date=as.Date(c("2012-1-1","2012-2-1","2012-3-1","2012-4-1","2012-5-1")), value=c(10,15,25,15,20))
      adjuster       date value
1     Mary 2012-01-01    10
2     Mary 2012-02-01    15
3      Bob 2012-03-01    25
4      Bob 2012-04-01    15
5     Mary 2012-05-01    20

元の質問でこれについて言及しなかったので、元のデータに対して単純に機能する答えを選びます。

4

4 に答える 4

7

data.frame の調整を最小限に抑えるように更新し、group = 1引数を追加しました

data.frame を少しいじりました。いじり回しを自動化できるはずです。そうでない場合はお知らせください。また、ggplot質問に投稿したチャートに従ってコマンドが機能していませんでした

df<-data.frame(
  adjuster=c("Mary","Mary","Bob","Bob"), 
  date=as.Date(c("2012-1-1","2012-2-1","2012-3-1","2012-4-1")), 
  value=c(10,15,25,15)
)

library(data.table)
library(ggplot2)
dt <- data.table(df)
dt[,adjuster := as.character(adjuster)]
dt[,prevadjuster := c(NA,head(adjuster,-1))]
dt[is.na(prevadjuster),prevadjuster := adjuster]


ggplot(dt) +
geom_line(aes(x=date,y=value, color = prevadjuster, group = 1)) +
geom_line(aes(x=date,y=value, color = adjuster, group = 1)) +
geom_point(aes(x=date,y=value, color = adjuster, group = 1))
于 2013-11-01T17:17:47.383 に答える
3

データフレームを変更する必要がなく、直感的で (レイヤーがどのように描画されるかを考えれば)、線が互いに上書きされないソリューションを提案したいと思います。ただし、1 つ問題があります。線種を変更することはできません。その理由がわからないので、誰かが私たちを啓発するためにチャイムを鳴らすことができれば、それは素晴らしいことです.

OPへの簡単な答え:

ggplot(df, aes(x = date, y = value, color = adjuster))+
    geom_line(aes(group = 1, colour = adjuster))+
    geom_point(aes(group = adjuster, color = adjuster, shape = adjuster))

OP のデータフレームでは、group=1期間全体にわたるグループを作成するために使用できます。

図で示した例:

# Create data
df <- structure(list(year = c(1990, 2000, 2010, 2020, 2030, 2040), 
    variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Something", class = "factor"), 
    value = c(4, 5, 6, 7, 8, 9), category = structure(c(1L, 1L, 1L, 
    2L, 2L, 2L), .Label = c("Observed", "Projected"), class = "factor")), .Names = c("year", 
"variable", "value", "category"), row.names = c(NA, 6L), class = "data.frame")

# Load library
library(ggplot2)

OP に似た基本的なプロットは、データをinsideと insideのcategory両方でグループ化し、このアプリケーションでは、線が 2 つのカテゴリ間で 2 つのポイントを「ブリッジ」しないという望ましくない結果をもたらします。geom_point(aes())geom_line(aes())

# Basic ggplot with geom_point() and geom_line()
p <- ggplot(data = df, aes(x = year, y = value, group = category)) + 
    geom_point(aes(colour = category, shape = category), size = 4) +
    geom_line(aes(colour = category), size = 1)
ggsave(p, file = "ggplot-points-connect_p1.png", width = 10, height = 10)

ここに画像の説明を入力

私の解決策の鍵は、グループ化することですが、内部variableで色付けすることですcategorygeom_line(aes())

# Modified version to connect the dots "continuously" while preserving color grouping
p <- ggplot(data = df, aes(x = year, y = value)) + 
    geom_point(aes(group = category, colour = category, shape = category), size = 4) +
    geom_line(aes(group = variable, colour = category), size = 1)
ggsave(p, file = "ggplot-points-connect_p2.png", width = 10, height = 10)

ここに画像の説明を入力

ただし、悲しいことに、このアプローチでは、現在のところ、線種を制御することはできません。

ggplot(data = df, aes(x = year, y = value)) + 
    geom_point(aes(group = category, colour = category, shape = category), size = 4) +
    geom_line(aes(group = variable, colour = category), linetype = "dotted", size = 1)
## Error: geom_path: If you are using dotted or dashed lines, colour, size and linetype must be constant over the line

備考: 私は別のデータフレームを使用しています。これは、自分が行っていたことからコピーして貼り付けているため、この質問にアクセスしたためです。この方法で画像をアップロードできます。

于 2014-12-23T09:35:25.093 に答える
2

これが簡単な解決策です。元の data.frame を変更する必要はありません。

ggplot()+
geom_line(aes_string(x='date',y='value'), data=df, lty=2)+
geom_point(aes_string(x='date',y='value', color='adjuster'), data=df)+
geom_line(aes_string(x='date',y='value', color='adjuster'), data=df)

これは、ggplot の私のお気に入りの機能の 1 つです。プロットをきれいに重ねることができます。

結果は次のとおりです。 ここに画像の説明を入力

于 2013-11-01T17:37:45.803 に答える