我有一个df:
Year Ratio N Mean sd se ci
97 1867 TILLBANK...PLACTILL 2 3.861999 4.082170 2.886530 36.67685
98 1867 TILLOBL..PLACTILL 2 21.848833 17.859532 12.628596 160.46153
99 1867 TILLLOAN.PLACTILL 2 54.197044 23.309360 16.482207 209.42629
100 1867 TILLEQUI.PLACTILL 2 0.000000 0.000000 0.000000 0.00000
101 1867 TILLCONT.PLACTILL 2 0.000000 0.000000 0.000000 0.00000
102 1867 TILLRECI.PLACTILL 2 10.772286 5.110514 3.613679 45.91615
str(df) :
'data.frame': 1152 obs. of 7 variables:
$ Year : Factor w/ 156 levels "1855","1856",..: 13 13 13 13 13 13 13 13 14 14 ...
$ Ratio: Factor w/ 8 levels "TILLBANK...PLACTILL",..: 1 2 3 4 5 6 7 8 1 2 ...
$ N : num 2 2 2 2 2 2 2 2 2 2 ...
$ Mean : num 3.86 21.85 54.2 0 0 ...
$ sd : num 4.08 17.86 23.31 0 0 ...
$ se : num 2.89 12.63 16.48 0 0 ...
$ ci : num 36.7 160.5 209.4 0 0 ...
1)我正在做ggplot
:
qqs<-ggplot(dfccomp, aes(x=Year, y=sd,colour=Ratio))+geom_point()+
facet_grid(Ratio~.)+
theme(axis.text.x = element_text(angle=-90, hjust=0.5, size=11,colour="black"))
此图适用于geom_point()
,但现在使用geom_line()
。如果我使用geom_point()
那么我会在所有年份(从1867年到2010年)获得非常混乱的x轴:
如果我使用geom_line()
,这不起作用,我得到:
所以,我想知道如何才能在x轴上选择某些年份?
2)我不理解的另一件奇怪的事情是我将上面的df$Year
转换为数字,
df$Year=as.numeric(as.character(df$Year))
情节是:
现在,x轴上只有3年。哪个更好,但仍然不是我想要的......
为什么geom_point()
和geom_line()
都有效?
更新: 在下面的答案中,我读到“年份是一个因素,因此ggplot()会相应地解释它并产生一个点图。之所以geom_line()没有做任何事情,因为这个geom对所提供的数据没有意义;因果性质指示ggplot()x轴不连续,并且在该轴上的点之间没有任何东西可以绘制,因此没有线。“
但我有一个不同的情节,其中geom_line()
适用于一个因素。为什么会这样?
qq<-ggplot(df, aes(x=Year, y=Mean,colour=Ratio)) +
geom_errorbar(aes(ymin=Mean-sd, ymax=Mean+sd), colour="black", width=.1, position=position_dodge(.1)) +
geom_line(position=position_dodge(.1)) +
geom_point(position=position_dodge(.1), size=3, shape=21, fill="white") + # 21 is filled circle
xlab("Year") +
ylab("Mean (%)")+ggtitle("Ratios")+facet_grid(Ratio~.)+theme(axis.text.x = element_text(angle=-90, hjust=0.5, size=11,colour="black"))
图片:
答案 0 :(得分:6)
Year
是一个因素,因此ggplot()
会相应地解释它并产生一个点图。 geom_line()
没有做任何事情的原因,因为这个geom对所提供的数据没有意义;因子自然指示ggplot()
x轴不连续,并且在该轴上的点之间没有任何东西可绘制,因此没有线。
在将geom_line()
转换为数字变量后,Year
获得的数字清楚地显示了这种情况。现在ggplot()
遵循其语法,为连续的x轴数据生成折线图。
所以现在你的问题归结为控制x轴上的比例(比例是ggplot()
调用轴的比例)。我看到两个选项;
scale_x_continous()
Year
提供您自己的比例
Date
数字数据转换为ggplot()
对象,让scale_x_date()
处理比例或通过Date
进行自定义,如文档和说明here < / LI>
醇>
要转换为dfccomp <- transform(dfccomp,
Year = as.Date(paste(Year, "01", "01", sep = "-")))
对象,您可以执行以下操作:
"01"
将两个"01"
更改为您想要的任何月份(第一个minor_breaks
)或月份,但无论您选择什么,它实际上是任意的而不是必需的;该数据点将相隔1年。
然后,您可以使用scale_x_date()
中的breaks
参数来控制显示次要刻度的数量或位置,加上{{1}}参数来设置显示的年份。我建议你不要显示所有年份,否则产生的情节将是一团糟。你也不需要每年作为一个小小的突破,因为网格线只会淹没情节。
答案 1 :(得分:6)
如果您使用Year
作为因素,ggplot
将为每个因素级别打印一个标签。您可以在前两个图中看到这一点。
如果您使用Year
作为数字变量,ggplot
将自动为x轴标签选择值的子集。在第三个图中,两次休息之间的距离为100。
您可以手动指定x轴上断点的位置scale_x_continuous
和参数breaks
。在下面的示例中,中断之间的距离为20.使用代码来查找所需的绘图。
ggplot(df, aes(x=as.numeric(as.character(Year)), y=sd, colour=Ratio)) +
geom_point() +
facet_grid(Ratio~.) +
theme(axis.text.x = element_text(angle=-90, hjust=0.5, size=11,colour="black")) +
scale_x_continuous(breaks = as.numeric(levels(df$Year))[c(TRUE, rep(FALSE, 19))])