首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绘制geom_point和geom_lines

绘制geom_point和geom_lines
EN

Stack Overflow用户
提问于 2014-07-01 18:49:52
回答 2查看 400关注 0票数 2

我正试图使用ggplot制作一个多行图。我还想在线上画一些点(这意味着意义)。问题是,当我使用geom_point时,这些点与我想要的线不重合。这些将是数据:

代码语言:javascript
运行
复制
dat1: 
                1-4      2-5     3-6      4-7     5-8     6-9    7-10        id
 mod1      -0.035930 0.121970 0.34689 0.034345 0.35312 0.52048 0.58536     mod1
 mod2      -0.094121 0.297150 0.37262 0.512140 0.63918 0.42127 0.73890     mod2
 mod3       0.810550 0.876070 0.57120 0.472640 0.67341 0.79332 0.80882     mod3
 mod4      -0.121970 0.010009 0.49783 0.920100 0.76192 0.45662 0.45526     mod4

dat2:
             1-4     2-5 3-6    4-7     5-8     6-9    7-10        id
 mod1         NaN     NaN NaN    NaN     NaN     NaN     NaN     mod1
 mod2         NaN     NaN NaN    NaN 0.63918     NaN     NaN     mod2
 mod3      0.81055 0.87607 NaN    NaN 0.67341 0.79332 0.80882    mod3
 mod5          NaN     NaN NaN 0.9201 0.76192     NaN     NaN    mod4

图将包含4行,在模型中有一些值,我想用点来绘制它们。

这是我的尝试:

代码语言:javascript
运行
复制
#Start Plotting
library(ggplot2)
library(reshape2)
dat_r$id <- nam_model  #names of models
dat_r1$id <- nam_model
df <- melt(dat_r,id='id')
df2 <-melt(dat_r1,id='id')

p <-ggplot(df, aes(x=variable,y=value, group=id)) +
     geom_line(aes(color=id), lwd=1) + geom_point(aes(x=df2$variable,y=df2$value,      group=df$id),size = 4)

有什么建议吗?我很感激任何想法!

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-01 19:55:01

首先阅读数据:

代码语言:javascript
运行
复制
dat1 <- read.table(header=TRUE, check.names=FALSE, text="1-4      2-5     3-6      4-7     5-8     6-9    7-10        id
-0.035930 0.121970 0.34689 0.034345 0.35312 0.52048 0.58536     mod1
-0.094121 0.297150 0.37262 0.512140 0.63918 0.42127 0.73890     mod2
 0.810550 0.876070 0.57120 0.472640 0.67341 0.79332 0.80882     mod3
-0.121970 0.010009 0.49783 0.920100 0.76192 0.45662 0.45526     mod4")

dat2 <- read.table(header=TRUE, check.names=FALSE, text="1-4     2-5 3-6    4-7     5-8     6-9    7-10        id
 NaN     NaN NaN    NaN     NaN     NaN     NaN     mod1
 NaN     NaN NaN    NaN 0.63918     NaN     NaN     mod2
 0.81055 0.87607 NaN    NaN 0.67341 0.79332 0.80882    mod3
 NaN     NaN NaN 0.9201 0.76192     NaN     NaN    mod4")

而不是使用reshape2包将数据转换为长格式:

代码语言:javascript
运行
复制
library(reshape2)
df1 <- melt(dat1, id="id")
df2 <- melt(dat2, id="id")

您还可以使用dplyrtidyr包的组合:

代码语言:javascript
运行
复制
library(dplyr)
library(tidyr)

df1 <- dat1 %>% gather(var, value, 1:7)
df2 <- dat2 %>% gather(var, value, 1:7)

将数据绑定到一个数据中(不一定是这样):

代码语言:javascript
运行
复制
dat <- cbind(df1,df2[,3])
names(dat) <- c("id","var","value1","value2")

最后,创建一个情节:

代码语言:javascript
运行
复制
ggplot(data=dat, aes(x=var, y=value1, color=id, group=id)) +
  geom_line(lwd=1) + 
  geom_point(aes(y=value2), size=4) +
  scale_x_discrete("\nModels") +
  scale_y_continuous("Value", breaks=c(0,0.2,0.4,0.6,0.8)) +
  theme_bw()

这意味着:

当您不想将数据绑定到一个dataframe中时,可以使用:

代码语言:javascript
运行
复制
ggplot(data=df1, aes(x=var, y=value, color=id, group=id)) +
  geom_line(lwd=1) + 
  geom_point(data=df2, size=4) +
  scale_x_discrete("\nModels") +
  scale_y_continuous("Value", breaks=c(0,0.2,0.4,0.6,0.8)) +
  theme_bw()
票数 2
EN

Stack Overflow用户

发布于 2014-07-01 19:58:40

这里有一种可能性:

使用check.names = FALSE读取数据,因为变量名在语法上无效。

代码语言:javascript
运行
复制
dat1 <- read.table(text = "                1-4      2-5     3-6      4-7     5-8     6-9    7-10        id
 mod1      -0.035930 0.121970 0.34689 0.034345 0.35312 0.52048 0.58536     mod1
 mod2      -0.094121 0.297150 0.37262 0.512140 0.63918 0.42127 0.73890     mod2
 mod3       0.810550 0.876070 0.57120 0.472640 0.67341 0.79332 0.80882     mod3
 mod4      -0.121970 0.010009 0.49783 0.920100 0.76192 0.45662 0.45526     mod4",
                   header = TRUE, check.names = FALSE)

dat2 <- read.table(text = "             1-4     2-5 3-6    4-7     5-8     6-9    7-10        id
 mod1         NaN     NaN NaN    NaN     NaN     NaN     NaN     mod1
 mod2         NaN     NaN NaN    NaN 0.63918     NaN     NaN     mod2
 mod3      0.81055 0.87607 NaN    NaN 0.67341 0.79332 0.80882    mod3
 mod5          NaN     NaN NaN 0.9201 0.76192     NaN     NaN    mod4",
                   header = TRUE, check.names = FALSE)

melt数据转换为长格式:

代码语言:javascript
运行
复制
library(reshape2)
dat1m <- melt(dat1, id.var = "id")
dat2m <- melt(dat2, id.var = "id")

用数据集绘制直线,用另一组数据绘制点:

代码语言:javascript
运行
复制
library(ggplot2)
ggplot(data = df1m, aes(x = variable, y = value, colour = id, group = id)) +
  geom_line() +
  geom_point(data = df2m, size = 4)

注意:在aes调用中,避免像dataset$variable这样的代码(例如df2$value)。它可能会导致不想要的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24517302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档