【问题标题】:x-axis scale in ggplotggplot中的x轴比例
【发布时间】:2026-02-24 16:05:03
【问题描述】:

我有一个数据框

df <-data.frame(apport=c("Min 1", "Min 2", "Org 2017","Org 2017","Org 2017",
                         "Org 2017","Org 2017","Org 2017","Org 2017","Org 2017",
                         "Org 2017","Org 2017"), periode_ap=c("Mai_32","Jui_34",
                          "Avr_30", "Avr_31","Avr_31","Avr_31","Mai_32","Mai_32","Mai_32",
                          "Mai_33","Mai_33","Mai_33"))

我做了一个ggplot

ggplot(df, aes(x=periode_ap, color=apport))+geom_density() 

但我想在 x 轴上显示我在此列表中的刻度:

list<-c("Jan_0", "Jan_1", "Fev_2", "Fev_3","Mar_4", "Mar_5", "Avr_6", "Avr_7", "Mai_8", "Mai_9", "Jui_10", "Jui_11", "Jul_12", "Jul_13", "Aou_14", "Aou_15", "Sep_16", "Sep_17", "Oct_18", "Oct_19", "Nov_20","Nov_21", "Dec_22", "Dec_23", "Jan_24", "Jan_25", "Fev_26", "Fev_27", "Mar_28", "Mar_29", "Avr_30","Avr_31", "Mai_32", "Mai_33", "Jui_34", "Jui_35", "Jul_36", "Jul_37", "Aou_38", 
 "Aou_39", "Sep_40", "Sep_41", "Oct_42", "Oct_43", "Nov_44", "Nov_45", "Dec_46", "Dec_47")

在我的数据中有一个从 Jan_0 到 Dec_47 而不是 Avr_30 到 Jui_34 的周期,如果你能帮助我,谢谢

【问题讨论】:

  • 要添加scale_x_discrete(labels = list) 吗?
  • @Ronak Shah:我试过了,但它在 Jan_0 到 Mar_4 之前替换了较旧的毕业(Avr_30 到 Mai_33),而不是从 Jan_0 到 Dec_47 的毕业,值在 Avr_30 到 Jui_34 !!!并带有警告消息:少于两个数据点的组已被删除! ——
  • @Ronak Shah:使用 geom_histogram scale_x_discrete(labels = list) 它可以工作,但没有 geom_density

标签: r ggplot2 scale axis


【解决方案1】:

您似乎有点绕着答案跳舞。问题在于您不能使用 xlim('Jan_0','Dec_47') 之类的东西,因为您的 x 轴刻度是离散的而不是连续的。 ggplot2 不知道应该如何组织您的数据,因此它只是默认为它存在于数据框中,并且不知道如何推断回“Jan_0”或更远至“Dec_47”。 (顺便说一句……我也没有……)

因此,如何扩展图表的答案是双重的:

(1) 告诉ggplot2您的数据是如何组织的。我将df$periode_ap设置为一个因素,并指出级别是您的列表。

lev_periode_ap <- list<-c("Jan_0", "Jan_1", "Fev_2", "Fev_3","Mar_4", "Mar_5", "Avr_6", "Avr_7", "Mai_8", "Mai_9", "Jui_10", "Jui_11", "Jul_12", "Jul_13", "Aou_14", "Aou_15", "Sep_16", "Sep_17", "Oct_18", "Oct_19", "Nov_20","Nov_21", "Dec_22", "Dec_23", "Jan_24", "Jan_25", "Fev_26", "Fev_27", "Mar_28", "Mar_29", "Avr_30","Avr_31", "Mai_32", "Mai_33", "Jui_34", "Jui_35", "Jul_36", "Jul_37", "Aou_38", 
        "Aou_39", "Sep_40", "Sep_41", "Oct_42", "Oct_43", "Nov_44", "Nov_45", "Dec_46", "Dec_47")

df$period_ap <- factor(df$periode_ap, levels=lev_periode_ap)

(2) 告诉ggplot2 如何处理这些级别。 现在ggplot2 知道df$periode_ap 是序数,它可以分辨什么是“最高”,什么是“最低” ",以及关键所有这些级别的顺序。我们需要表明我们希望通过scale_x_discrete(labels=...) 显示所有级别,但重要的是,我们要确保ggplot2 不会在没有数据的情况下删除任何级别。幸运的是,我们可以为此使用 drop= 参数。在对theme() 元素进行一些更改后,您会得到:

ggplot(df, aes(x=period_ap,color=apport))+ theme_bw() +
  geom_density() +
  scale_x_discrete(labels=lev_periode_ap, drop=FALSE) +
  theme(axis.text.x=element_text(angle=90, vjust=0.5, hjust=1))

现在,我们似乎缺少足够的数据点来使显示“Min 1”和“Min 2”的颜色有意义,但您提出的问题已经有了答案。

【讨论】: