Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为什么我的geom_线无法转换成正确的颜色?_R_Ggplot2_Linegraph - Fatal编程技术网

R 为什么我的geom_线无法转换成正确的颜色?

R 为什么我的geom_线无法转换成正确的颜色?,r,ggplot2,linegraph,R,Ggplot2,Linegraph,我遇到了一个关于使用geom_line()函数的小问题。 我的数据由一帧一帧的人工视频组成,由训练有素的观察者对某些行为进行评估,这导致每个观察者有数千个数据点。这基本上是一个向量,每个观察者由0和1组成,其中1表示想要的行为,0表示不想要的行为 经过反复研究,我得出以下结论: # a dataset from a manual videoanalysis with frame by frame behaviour assessment in binary. 0 = no, 1 = yes. d

我遇到了一个关于使用
geom_line()
函数的小问题。 我的数据由一帧一帧的人工视频组成,由训练有素的观察者对某些行为进行评估,这导致每个观察者有数千个数据点。这基本上是一个向量,每个观察者由0和1组成,其中1表示想要的行为,0表示不想要的行为

经过反复研究,我得出以下结论:

# a dataset from a manual videoanalysis with frame by frame behaviour assessment in binary. 0 = no, 1 = yes.
data1<-read.csv("ObserversBehaviour.csv", ",", header=T)

# my solution of giving each observer his own line, without having to transform the entire set
Obsy0 <- rep(0,4528)
Obsy1 <- rep(1,4528)
Obsy2 <- rep(2,4528)
Obsy3 <- rep(3,4528)
Obsy4 <- rep(4,4528)
Obsy5 <- rep(5,4528)
Obsy6 <- rep(6,4528)
Obsy7 <- rep(7,4528)
Obsy8 <- rep(8,4528)
Obsy9 <- rep(9,4528)
Obsy10 <- rep(10,4528)

ObsData <- data.frame(data1,Obsy0,Obsy1,Obsy2,Obsy3,Obsy4,Obsy5,Obsy6,Obsy7,Obsy8,Obsy9,Obsy10)

#vector giving each observer a number
Obsall <- c(0:10)

#The list of individual frames of video M01 (4528 in total)
Framerange <- ObsData[["Frames.M01"]]

ylabels <- c("Observer0","Observer1","Observer2","Observer3","Observer4","Observer5","Observer6","Observer7","Observer8","Observer9","Observer10")

#Ob<n>value is the 1 or 0 assessment
#had to use as.factor() because for some reason my 0s and 1s are seen as continuous
GraphObserve <-ggplot(ObsData,ylim=range(Obsall),xlim=max(Framerange),aes(x=Framerange))
geom_point(aes(x=Frames.M01, y = Obsy0, colour = as.factor(Ob0value), size=as.factor(Ob0value)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy1, colour = as.factor(Ob1value), size=as.factor(Ob1value)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy2, colour = as.factor(Ob2value), size=as.factor(Ob2value)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy3, colour = as.factor(Ob3value), size=as.factor(Ob3value)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy4, colour = as.factor(Ob4freeze.0.no.1.yes), size=as.factor(Ob4freeze.0.no.1.yes)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy5, colour = as.factor(Ob5value), size=as.factor(Ob5value)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy6, colour = as.factor(Ob6value), size=as.factor(Ob6value)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy7, colour = as.factor(Ob7value), size=as.factor(Ob7value)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy8, colour = as.factor(Ob8value), size=as.factor(Ob8value)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy9, colour = as.factor(Ob9value), size=as.factor(Ob9value)), shape=15) +
geom_point(aes(x=Frames.M01, y = Obsy10, colour = as.factor(Ob10value), size=as.factor(Ob10value)), shape=15) +

scale_colour_manual(breaks = c(0, 1),
  labels = c("No","Yes"),
  values = c("green4","red"),
  name="Assessment")+
#needed to let the wanted behaviour stand out, so I changed pointsize
scale_size_manual(breaks = c(0, 1), values=c(1,2), guide="none")+
scale_y_discrete(limit=Obsall, labels=ylabels, expand=c(0,0))+
scale_x_continuous(expand=c(0,0),breaks = round(seq(min(0), max(Framerange), by = 200),5000))+
expand_limits(y=c(1,-.5))

update_labels(GraphObserve,list(x="Frames (M01)",y ="Observers"))
我原以为这会很好,但事实并非如此

与在文件中每0和1切换一次颜色不同,颜色似乎在数据集中出现的第一个和最后一个1处切换

上述脚本中的图形:

我似乎无法在代码中找到错误,也无法在web上找到解决方案。这里有人能帮我解决这个问题吗

更新 为了更清楚地了解情况,我在它们下面放置了指向我以前的纸条生成的图形的链接

在建议将数据设置为“长”格式后,我使用了以下脚本:

data1<-read.csv("ObserversBehaviour.csv", ",", header=T)

Frames<-data1[["Frames.M01"]]
Obs<-paste0("Observer",0:10)
Obsy <- sort(rep(0:10,4528),decreasing=F)
Obsvalue <- stack(data1[,c(Obs)])
ObsData2 <- expand.grid(Frames=data1[["Frames.M01"]],Obs=paste0("Observer",0:10))  
ObsData2$Observer = Obsy
ObsData2$Assessment = Obsvalue$values

ggplot(ObsData2, aes(Frames, Observer, colour=Assessment)) +
  geom_line(show_guide=T) +
  scale_y_discrete(limit=0:10, labels=Obs, expand=c(0,0))+
  scale_x_continuous(expand=c(0,0),breaks = round(seq(min(0), max(Frames), by = 200),5000))+
  expand_limits(y=c(1,.5)) +
  #The manual colorcoding actually failed, since it keeps returning this error "Continuous value supplied to discrete scale".
  scale_color_manual(breaks = c(0,1),
                 labels = c("No","Yes"),
                 values = c("green4","red"),
                 name="Assessment")

如果您将数据放在“长”格式中,这将容易得多。下面是一个伪造数据的示例:

## Create fake data in long format
ObsData = expand.grid(Frames=1:4258, Obs=paste0("Observer",0:10))

# Add y values
set.seed(10)
ObsData$y = cumsum(rnorm(4258*11))
在一个长格式的数据框中,所有观察者被“堆叠”成一个单因子变量(
Obs
),有11个类别——每个观察者一个。现在,您可以在
ggplot
中将其用作色彩美学的分组变量

## Plot with a different color for each observer
ggplot(ObsData, aes(Frames, y, colour=Obs)) +
         geom_line()
以下是默认颜色下的图形外观,但您可以通过向绘图中添加
scale\u color\u manual()
并设置您喜欢的颜色来更改

问题已得到解决 在我同事的帮助下,使用
geom\u tile()
而不是
geom\u line()
图形现在完全符合我的要求

require("ggplot2")

data1<-read.csv("ObserversBehaviour.csv", ",", header=T)

Frames<-data1[["Frames.M01"]]
Obs.lab<-paste0("Observer",0:10)
Obsy <- sort(rep(1:11,4528),decreasing=F)
Obsvalue <- stack(data1[,c(Obs.lab)])

ObsData2 <- expand.grid(Frames=data1[["Frames.M01"]],Obs.lab=paste0("Observer",0:10))  
ObsData2$Observer = Obsy
ObsData2$Assessment = Obsvalue$values

GraphObserve <- ggplot(ObsData2, aes(Frames, Observer, height=.9)) +
  geom_tile(aes(fill = factor(Assessment)))+
  scale_fill_manual(values=c("0"="green4", "1"="red"), labels= c("No", "Yes"))+
  scale_y_discrete(expand=c(0,0), limit=1:11, labels=Obs.lab)+
  scale_x_continuous(expand=c(0,0), breaks = round(seq(min(0), max(Frames), by = 200),5000))
  update_labels(GraphObserve,list(x="Frames (M01)",y ="Observers"))
require(“ggplot2”)

数据1感谢您的快速响应和出色的建议。将数据转换为“长”格式确实有很大帮助,但还不能解决整个问题。有关更多详细信息,请参阅我更新的问题。您能发布一个
ObsData2
的示例吗。这将使帮助你变得更容易。将
dput(head(ObsData2))的输出粘贴到问题中
## Plot with a different color for each observer
ggplot(ObsData, aes(Frames, y, colour=Obs)) +
         geom_line()
require("ggplot2")

data1<-read.csv("ObserversBehaviour.csv", ",", header=T)

Frames<-data1[["Frames.M01"]]
Obs.lab<-paste0("Observer",0:10)
Obsy <- sort(rep(1:11,4528),decreasing=F)
Obsvalue <- stack(data1[,c(Obs.lab)])

ObsData2 <- expand.grid(Frames=data1[["Frames.M01"]],Obs.lab=paste0("Observer",0:10))  
ObsData2$Observer = Obsy
ObsData2$Assessment = Obsvalue$values

GraphObserve <- ggplot(ObsData2, aes(Frames, Observer, height=.9)) +
  geom_tile(aes(fill = factor(Assessment)))+
  scale_fill_manual(values=c("0"="green4", "1"="red"), labels= c("No", "Yes"))+
  scale_y_discrete(expand=c(0,0), limit=1:11, labels=Obs.lab)+
  scale_x_continuous(expand=c(0,0), breaks = round(seq(min(0), max(Frames), by = 200),5000))
  update_labels(GraphObserve,list(x="Frames (M01)",y ="Observers"))