R ggplot中x轴标签之间的自定义间距

R ggplot中x轴标签之间的自定义间距,r,R,我有一个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

我有一个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"))
图为:

现在,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"))

qq
Year
是一个因素,因此
ggplot()
将相应地解释该因素并生成点图。原因
geom_line()
没有任何作用,因为此geom对提供的数据没有意义;因子性质向
ggplot()
表明x轴不是连续的,并且该轴上的点之间没有可绘制的东西,因此没有直线

Year
转换为数字变量后,使用
geom_line()
得到的图形清楚地显示了这种情况。现在,
ggplot()
,按照其语法,为连续的x轴数据生成一个折线图

现在,您的问题归结为控制x轴上的比例(比例是
ggplot()
所称的轴)。我看到两种选择

  • 使用文档中的
    scale\u x\u continuous()
    提供您自己的刻度
  • 将您的
    年份
    数字数据转换为
    日期
    对象,并让
    ggplot()
    处理刻度或通过
    scale\u x\u Date()
    对其进行自定义,如文档所示
  • 要转换为日期对象,可以执行以下操作:

    dfccomp <- transform(dfccomp,
                         Year = as.Date(paste(Year, "01", "01", sep = "-")))
    

    dfccomp如果使用
    Year
    作为因子,
    ggplot
    将为每个因子级别打印一个标签。您可以在前两个图中看到这一点


    如果将
    Year
    用作数字变量,
    ggplot
    将自动为x轴的标签选择值的子集。在第三个绘图中,两个打断之间的距离为100

    您可以手动指定在x轴上使用
    scale\u x\u 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))])
    

    能否请您更新您的问题,以便我们可以“haz数据”或至少一个数字?不过,我怀疑您需要在
    aes
    调用中引入
    group
    变量。当然:)我觉得很奇怪,为什么当年份是数字时geom_line()和geom_point()都起作用。但我最想知道的是如何调整x轴比例,这样比例就不会像前两张图片那样凌乱了。顺致敬意,你快了几秒钟。谢谢加文!答案也很好!但请看我对这个问题的更新,geom_line()即使年份是一个因素也能工作…@user1665355不可能知道那里发生了什么,这个数字太小了,看不见。我想是因为你躲开了一小部分,这就允许画一条线。您不需要像这样的技巧来绕过数据的格式化方式。您应该将数据格式化为正确的类型,以便ggplot生成正确的图形。您显示的新图形与所有背景网格线有点混乱。当然,我只是想了解它的工作原理:)但非常感谢您提供的极好的答案!R有一条陡峭的学习曲线,多亏了你们,我们其他用户的学习曲线变得不那么陡峭了:)没有你们的数据,我无法检查,但它真的工作了吗?如果在调用
    geom_line()
    后停止,并且不添加任何其他层,您会得到一条线吗?如果没有您的数据,我无法自己运行,您的图显示了添加额外层后的结果。如果它确实显示了一些东西,那么这是回避,允许一些线被画出来,但我怀疑它是正确的。谢谢斯文!我确实查了scale\u x\u continuous,但我能正确地得到它:)再次感谢你的精彩回答!!
    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))])