install.packages("gcookbook")
install.packages("ggplot2")
library(ggplot2)
library(gcookbook)
x<-read.csv("G:/stock.csv",header=TRUE,sep=",")
b<-as.Date(x$日期)#日期类型转换
a<-data.frame(b,x[,-1])
names(a)<-c("日期","开盘价","最高价","最低价","收盘价")
attach(a)
colnames(a)
help(ggplot)
#xy对应a中实际存在的列名
ggplot(a, aes(x=日期, y=开盘价,group=1)) + geom_line(linetype="dotted")#点图,
>ggplot(a, aes(x=日期, y=开盘价,group=1)) + geom_line(color="blue")
>ggplot(a, aes(x=日期, y=收盘价)) + geom_line(size=2)#粗线
下面两种写法结果相同
>ggplot(stock, aes(x=日期, y=价格,colour=分类))+
geom_line())
>ggplot(stock, aes(x=日期, y=价格))+
geom_line(aes(color=分类)
区分出两个价格
#因为ggplot不能画双曲线,所以把最高价和最低价合并到一列,用颜色来区分
>d<-a[,c(1,3,4)]
#把最高价最低价行列转换要用到reshape2包中的melt
>library(reshape2)
>stock<-melt(d,id.vars ='日期')#行列转换最高最低分类
>colnames(stock)
>names(stock)<-c("日期","分类","价格")
>attach(stock)
>ggplot(stock, aes(x=日期, y=价格,group=1)) + geom_line(aes(color=分类))#区分最高价最低价两个分类
#标出最高价和最低价
>top1<-stock[which.max(stock[,3]),]#取最高价一行
>low1<-stock[which.min(stock[,3]),]#取最低价一行
>lev<-rbind(top1,low1)#合并
>ggplot(stock, aes(x=日期, y=价格,group=1)) +
geom_line(aes(color=分类))+
geom_point(data =lev$价格)
Error: ggplot2 doesn't know how to deal with data of class numeric
Error: ggplot2 doesn’t know how to deal with data of class numeric
查询了下这个错误,说是ggplot2 中,所有函数中data 变量,均要data.frame 类型
但lev是data.frame类型的,继续查看错误原因
> class(lev)
[1] "data.frame"
正确写法
> ggplot(stock, aes(x=日期, y=价格,colour=分类)) +
+ geom_line()+
+ geom_point(data =lev)
图形上出现两个点
给这两个点添加标签
ggplot(stock, aes(x=日期, y=价格,colour=分类)) +
geom_line()+
geom_point(data =lev)
+geom_text(aes(label = 分类),data = lev)
Error: Aesthetics must be either length 1 or the same as the data (2): x, y, label, colour
正确写法
ggplot(stock, aes(x=日期, y=价格))+
geom_line(aes(color=分类))+
geom_point(data =lev)+
geom_text(aes(label=分类),data=lev)