如何根据方向制作具有不同颜色段的(ggplot)线图

发布于 2024-08-07 11:58:22 字数 4551 浏览 4 评论 0原文

根据 Shanes 另一个问题的优秀 解决方案,我现在意识到我不知道该怎么做。

我最初的方法是使用融化数据(再次感谢谢恩):

dm1 <- melt(d[,c("Type","I.alt","idx06","idx07","idx08")], id=c("Type","I.alt"))
dm2 <- melt(d[,c("Type","I.alt","farve1","farve2")], id=c("Type","I.alt"))
colnames(dm2) <- c("Type", "I.alt", "variable2", "value2")
dm <- merge(dm1, dm2)

然后绘制图:

ggplot(dm, aes(x=variable,y=value,group=Type,label=Type,size=I.alt))+
  geom_line(aes(col=value2))+
  geom_text(data=subset(dm, variable=="idx08"),hjust=-0.2, size=2.5)+
  theme_bw()+
  scale_x_discrete(expand=c(0,1))+
  opts(legend.position="none")+
  scale_colour_manual(values=c("green","red"))

但它不起作用(所有“向上”的单独线段应该是红色,所有“向下”的线段应该是绿色):

< a href="http://wana.dk/wp-content/uploads/2009/10/damn.png" rel="nofollow noreferrer">顺便说一句:png设备是否坚持geom_point? http://wana.dk/wp-content/uploads/2009/10/damn.png

(额外问题1:我如何使用展开来仅展开到右侧?(我的标签在哪里。) )

(额外问题 2:png 和 pdf 设备都像上面一样显示 - 即使用 geom_points - 这不会发生在我的屏幕上)

这是我的数据:

d <- structure(list(Type = structure(c(8L, 21L, 23L, 20L, 6L, 14L, 
3L, 24L, 2L, 28L, 32L, 22L, 15L, 29L, 1L, 17L, 18L, 33L, 25L, 
13L, 30L, 11L, 26L, 9L, 12L, 4L, 5L, 27L, 16L, 19L, 10L, 31L, 
7L), .Label = c("Alvorligere vold", "Andre strafferetlige særlove", 
"Andre tyverier", "Bedrageri", "Brandstiftelse", "Butikstyverier m.v.", 
"Dokumentfalsk", "Færdselslovovertræd. i øvrigt", "Færdselsuheld med spiritus", 
"Falsk forklaring i øvrigt", "Forbr. mod off. myndighed m.v.", 
"Freds- og ærekrænkelser", "Hæleri", "Hærværk", "Indbrud i bank, forretn. m.v.", 
"Indbrud i fritidshuse, garager mv", "Indbrud i villaer, lejligheder mv", 
"Love vedr. forsvaret og lign.", "Love vedr. spil, bev., næring", 
"Lov om euforiserende stoffer", "Mangler ved køretøj", "Røveri", 
"Simpel vold", "Spiritus- og promillekørsel", "Trusler", "Tyv./brugstyv. af andet", 
"Tyv./brugstyv. af cykel", "Tyv./brugstyv. af indr. køretøj", 
"Tyv/brugstyv. af knallert", "Tyveri fra bil, båd m.v.", "Ulovlig omgang med hittegods", 
"Våbenloven", "Vold o.l. mod off. myndighed"), class = "factor"), 
I.alt = c(16137L, 9519L, 5930L, 5502L, 4887L, 3582L, 3101L, 
1738L, 1660L, 1649L, 1551L, 1412L, 1338L, 1164L, 1154L, 1057L, 
931L, 907L, 857L, 724L, 681L, 644L, 641L, 505L, 450L, 419L, 
405L, 328L, 324L, 324L, 320L, 281L, 262L), idx06 = c(1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), idx07 = c(0.972675591417568, 
0.766866371450899, 0.931743805516597, 0.813047711781889, 
0.88728323699422, 0.96420233463035, 0.855743544078362, 1.03710247349823, 
0.751470588235294, 0.90443686006826, 0.808403361344538, 0.902834008097166, 
0.718181818181818, 0.904555314533623, 1.02717391304348, 0.68957345971564, 
1.10324483775811, 0.93030303030303, 0.805309734513274, 0.843003412969283, 
0.74914089347079, 0.824786324786325, 1.04060913705584, 1.09150326797386, 
0.977941176470588, 0.892405063291139, 0.966666666666667, 
0.828125, 0.696, 0.813559322033898, 0.697841726618705, 0.88235294117647, 
0.62280701754386), idx08 = c(0.986612873647533, 0.712685595207085, 
0.840579710144927, 0.865628042843233, 0.93757225433526, 0.823346303501945, 
0.905609973285841, 1.03356890459364, 0.689705882352941, 0.909556313993174, 
0.798319327731092, 0.955465587044534, 0.714545454545455, 
0.620390455531453, 1.10869565217391, 0.815165876777251, 0.64306784660767, 
0.818181818181818, 0.722713864306785, 0.627986348122867, 
0.59106529209622, 0.927350427350427, 1.21319796954315, 1.20915032679739, 
1.33088235294118, 0.759493670886076, 1.40833333333333, 0.734375, 
0.896, 0.932203389830508, 0.60431654676259, 0.872549019607843, 
0.675438596491228), farve1 = c("green", "green", "green", 
"green", "green", "green", "green", "red", "green", "green", 
"green", "green", "green", "green", "red", "green", "red", 
"green", "green", "green", "green", "green", "red", "red", 
"green", "green", "green", "green", "green", "green", "green", 
"green", "green"), farve2 = c("red", "green", "green", "red", 
"red", "green", "red", "green", "green", "red", "green", 
"red", "green", "green", "red", "red", "green", "green", 
"green", "green", "green", "red", "red", "red", "red", "green", 
"red", "green", "red", "red", "green", "green", "red")), .Names = c("Type", 
"I.alt", "idx06", "idx07", "idx08", "farve1", "farve2"), class = "data.frame", row.names = c(NA, -33L))

As per Shanes excellent solution of another question, I now realise that I do not know how to do this.

My original approach was to use melt the data (thanks again shane):

dm1 <- melt(d[,c("Type","I.alt","idx06","idx07","idx08")], id=c("Type","I.alt"))
dm2 <- melt(d[,c("Type","I.alt","farve1","farve2")], id=c("Type","I.alt"))
colnames(dm2) <- c("Type", "I.alt", "variable2", "value2")
dm <- merge(dm1, dm2)

And then make the plot:

ggplot(dm, aes(x=variable,y=value,group=Type,label=Type,size=I.alt))+
  geom_line(aes(col=value2))+
  geom_text(data=subset(dm, variable=="idx08"),hjust=-0.2, size=2.5)+
  theme_bw()+
  scale_x_discrete(expand=c(0,1))+
  opts(legend.position="none")+
  scale_colour_manual(values=c("green","red"))

But it's not working (all the individual line pieces going "up" should be red, all going "down" should be green):

BTW:does the png device insist on geom_point? http://wana.dk/wp-content/uploads/2009/10/damn.png

(bonus question 1: how can I use expand to only expand to the right? (where my labels ' at.))

(bonus question 2: Both png and pdf device shows up like above - i.e. with geom_points - this does not happen on my screen)

This is my data:

d <- structure(list(Type = structure(c(8L, 21L, 23L, 20L, 6L, 14L, 
3L, 24L, 2L, 28L, 32L, 22L, 15L, 29L, 1L, 17L, 18L, 33L, 25L, 
13L, 30L, 11L, 26L, 9L, 12L, 4L, 5L, 27L, 16L, 19L, 10L, 31L, 
7L), .Label = c("Alvorligere vold", "Andre strafferetlige særlove", 
"Andre tyverier", "Bedrageri", "Brandstiftelse", "Butikstyverier m.v.", 
"Dokumentfalsk", "Færdselslovovertræd. i øvrigt", "Færdselsuheld med spiritus", 
"Falsk forklaring i øvrigt", "Forbr. mod off. myndighed m.v.", 
"Freds- og ærekrænkelser", "Hæleri", "Hærværk", "Indbrud i bank, forretn. m.v.", 
"Indbrud i fritidshuse, garager mv", "Indbrud i villaer, lejligheder mv", 
"Love vedr. forsvaret og lign.", "Love vedr. spil, bev., næring", 
"Lov om euforiserende stoffer", "Mangler ved køretøj", "Røveri", 
"Simpel vold", "Spiritus- og promillekørsel", "Trusler", "Tyv./brugstyv. af andet", 
"Tyv./brugstyv. af cykel", "Tyv./brugstyv. af indr. køretøj", 
"Tyv/brugstyv. af knallert", "Tyveri fra bil, båd m.v.", "Ulovlig omgang med hittegods", 
"Våbenloven", "Vold o.l. mod off. myndighed"), class = "factor"), 
I.alt = c(16137L, 9519L, 5930L, 5502L, 4887L, 3582L, 3101L, 
1738L, 1660L, 1649L, 1551L, 1412L, 1338L, 1164L, 1154L, 1057L, 
931L, 907L, 857L, 724L, 681L, 644L, 641L, 505L, 450L, 419L, 
405L, 328L, 324L, 324L, 320L, 281L, 262L), idx06 = c(1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), idx07 = c(0.972675591417568, 
0.766866371450899, 0.931743805516597, 0.813047711781889, 
0.88728323699422, 0.96420233463035, 0.855743544078362, 1.03710247349823, 
0.751470588235294, 0.90443686006826, 0.808403361344538, 0.902834008097166, 
0.718181818181818, 0.904555314533623, 1.02717391304348, 0.68957345971564, 
1.10324483775811, 0.93030303030303, 0.805309734513274, 0.843003412969283, 
0.74914089347079, 0.824786324786325, 1.04060913705584, 1.09150326797386, 
0.977941176470588, 0.892405063291139, 0.966666666666667, 
0.828125, 0.696, 0.813559322033898, 0.697841726618705, 0.88235294117647, 
0.62280701754386), idx08 = c(0.986612873647533, 0.712685595207085, 
0.840579710144927, 0.865628042843233, 0.93757225433526, 0.823346303501945, 
0.905609973285841, 1.03356890459364, 0.689705882352941, 0.909556313993174, 
0.798319327731092, 0.955465587044534, 0.714545454545455, 
0.620390455531453, 1.10869565217391, 0.815165876777251, 0.64306784660767, 
0.818181818181818, 0.722713864306785, 0.627986348122867, 
0.59106529209622, 0.927350427350427, 1.21319796954315, 1.20915032679739, 
1.33088235294118, 0.759493670886076, 1.40833333333333, 0.734375, 
0.896, 0.932203389830508, 0.60431654676259, 0.872549019607843, 
0.675438596491228), farve1 = c("green", "green", "green", 
"green", "green", "green", "green", "red", "green", "green", 
"green", "green", "green", "green", "red", "green", "red", 
"green", "green", "green", "green", "green", "red", "red", 
"green", "green", "green", "green", "green", "green", "green", 
"green", "green"), farve2 = c("red", "green", "green", "red", 
"red", "green", "red", "green", "green", "red", "green", 
"red", "green", "green", "red", "red", "green", "green", 
"green", "green", "green", "red", "red", "red", "red", "green", 
"red", "green", "red", "red", "green", "green", "red")), .Names = c("Type", 
"I.alt", "idx06", "idx07", "idx08", "farve1", "farve2"), class = "data.frame", row.names = c(NA, -33L))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

徒留西风 2024-08-14 11:58:22

您的合并不起作用,因为您只有两个颜色变量,但有三个数据值。添加第三个颜色变量作为填充似乎可以解决问题。 geom_line 从前一个数据点的值获取颜色,因此不使用“value2”的最后一个值。

d$farve3<-NA
dm1 <- melt(d[,c("Type","I.alt","idx06","idx07","idx08")], id=c("Type","I.alt"))
dm2 <- melt(d[,c("Type","I.alt","farve1","farve2","farve3")], id=c("Type","I.alt"))
colnames(dm2) <- c("Type", "I.alt", "variable2", "value2")
dm<-cbind(dm1,dm2)
ggplot(dm, aes(x=variable,y=value,group=Type,label=Type,size=I.alt))+
  geom_line(aes(col=value2))+
  geom_text(data=subset(dm, variable=="idx08"),hjust=-0.2, size=2.5)+
  theme_bw()+
  scale_x_discrete(expand=c(0,1))+
  opts(legend.position="none")+
  scale_colour_manual(values=c("green","red"))

Your merge didn't work because you only had two colour variables, but three data values. Adding a third colour variable as padding seems to do the trick. geom_line takes it's colour from the previous datapoint's value, so the last value of "value2" is not used.

d$farve3<-NA
dm1 <- melt(d[,c("Type","I.alt","idx06","idx07","idx08")], id=c("Type","I.alt"))
dm2 <- melt(d[,c("Type","I.alt","farve1","farve2","farve3")], id=c("Type","I.alt"))
colnames(dm2) <- c("Type", "I.alt", "variable2", "value2")
dm<-cbind(dm1,dm2)
ggplot(dm, aes(x=variable,y=value,group=Type,label=Type,size=I.alt))+
  geom_line(aes(col=value2))+
  geom_text(data=subset(dm, variable=="idx08"),hjust=-0.2, size=2.5)+
  theme_bw()+
  scale_x_discrete(expand=c(0,1))+
  opts(legend.position="none")+
  scale_colour_manual(values=c("green","red"))
醉南桥 2024-08-14 11:58:22

我只是指出这个相关问题。这是一个真正的飞跃从这个解决方案去解决您的特定问题,但我发布这个以防它可能有帮助。

对于此示例数据:

b<-cumsum(rnorm(100))
x<-sample(c(1,2), size=100, replace=TRUE)
t<-1:(length(b))

这里 x 代表您的值,b 是颜色(上升/下降),t 是 x 轴。用melt:重新格式化它

library(ggplot2)
tmp <- melt(data.frame(cbind(t,b,x)),meas=c("x"))
head(tmp)

并绘制它:

ggplot(tmp, aes(x=t,groups=variable)) +
        facet_wrap(~variable) +
        geom_path(aes(y=b,colour=factor(value))) +
        labs(x=NULL) 

I would just point out this related question. It's a real leap to go from this solution to solving your particular problem, but I'm posting this in case it might help.

With this sample data:

b<-cumsum(rnorm(100))
x<-sample(c(1,2), size=100, replace=TRUE)
t<-1:(length(b))

Here x would represent your values, b is the color (rising/falling), and t is the x-axis. Reformat it with melt:

library(ggplot2)
tmp <- melt(data.frame(cbind(t,b,x)),meas=c("x"))
head(tmp)

And plot it:

ggplot(tmp, aes(x=t,groups=variable)) +
        facet_wrap(~variable) +
        geom_path(aes(y=b,colour=factor(value))) +
        labs(x=NULL) 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文