[英]How I can adjust the scale of axis X with breaks as.integer when I graph missing dates in R ggplot2
How I can adjust the scales axis X in breaks as.integer when I have a lot of data graphing missing dates.当我有大量数据绘制缺失日期时,如何将刻度轴 X 调整为整数。
The code that I am using is the next (@Stefan Helped me):我正在使用的代码是下一个(@Stefan 帮助我):
#SET OF DATA
df <- read.table(text="
Fecha - T - Tmin - Tmax
2015-07-01 - 11,16 - 7,3 - 17
2015-07-02 - 11,49 - 8 - 17,1
2015-07-03 - 11,2 - 8,8 - 15,8
2015-07-04 - 11,20 - 8,6 - 16
2015-07-05 - 11,23 - 8,9 - 15,7
2015-07-06 - 10,40 - 7,7 - 15,4
2015-07-07 - 10,10 - 8,1 - 14,8
2015-07-08 - 10,04 - 7,3 - 15,4
2018-01-01 - 11,08 - 4,9 - 17,8
2018-01-02 - 11,40 - 4,2 - 16,3
2018-01-03 - 9,000 - 5,5 - 13,5
2018-01-04 - 8,584 - 6 - 12,8
2018-01-05 - 8,679 - 7,3 - 11,9
2018-01-06 - 8,75 - 6,8 - 13
2018-01-07 - 9,33 - 6,4 - 15,2
2018-01-08 - 9,63 - 6,3 - 13,9
", header = TRUE, dec = ",")
mmp1 <- df[,!grepl("^X", names(df))]
mmp1$Fecha <- as.Date(mmp1$Fecha)
library(ggplot2)
library(scales)
library(dplyr)
library(tibble)
mmp2 <- mmp1 %>%
mutate(
year_fecha = as.character(lubridate::year(Fecha)),
Fecha2 = format(Fecha, "%d-%m"),
Fecha2 = forcats::fct_reorder(Fecha2, Fecha)) %>%
arrange(Fecha) %>%
rowid_to_column(var = "Fecha3")
# Put the theme code aside
polish <- theme(text = element_text(size=11)) +
theme(axis.text.x=element_text(angle=45, hjust=1))+
theme(plot.title = element_text(hjust = 0.5))+
theme(panel.background = element_rect(fill = 'white', colour = 'white', size = 1.2, linetype = 7))+
theme(text=element_text(family="arial", face="bold", size=12))+
theme(axis.title.y = element_text(face="bold", family = "arial", vjust=1.5, colour="black", hjust = 0.5, size=rel(1.2)))+
theme(axis.title.x = element_text(face="bold", family = "arial", vjust=0.5, colour="black", size=rel(1.2)))+
theme(axis.text.x = element_text(family= "sans",face = "plain", colour="black", size=rel(1.1)))+
theme(axis.text.y = element_text(family= "sans",face = "plain", colour="black", size=rel(1.1)))+
theme(axis.line = element_line(size = 1, colour = "black"))+
theme(legend.title = element_text(colour="black", size=12, face="bold", family = "arial"))+
theme(legend.key = element_rect(fill = "white"))
# Simple and prefered solution: Facet by e.g. by year
w1 <- ggplot(data = mmp2) +
geom_line(mapping = aes(x = Fecha, y = Tmin, colour="Min"), size=0.71) +
geom_line(mapping = aes(x = Fecha, y = T, colour="P"), size=0.71) +
geom_line(mapping = aes(x = Fecha, y = Tmax, colour="Max"), size=0.71) +
scale_x_date(date_breaks = "1 day", date_labels = "%d-%m", expand = (c(0.001,0.008)))+
scale_y_continuous(breaks=seq(-4, 28, 2), limits = c(1,18), expand=c(0,0)) +
scale_colour_manual(name="Leyenda",
values=c(Min="green", P="#56B4E9", Max="Red")) +
ylab("Temperatura (C)")+
xlab("Tiempo") +
guides(colour=guide_legend(order = 2),
shape=guide_legend(order = 2)) +
facet_wrap(~year_fecha, scales = "free_x") +
polish
w1
The first result is:第一个结果是:
# Hacky solutions with some manual labelling
labs <- select(mmp2, Fecha3, Fecha2) %>%
tibble::deframe()
date_lab <- function(x) {
labs[as.character(x)]
}
# Draw the data as one continuous line
w2 <- ggplot(data = mmp2) +
geom_line(mapping = aes(x = Fecha3, y = Tmin, colour="Min"), size=0.71) +
geom_line(mapping = aes(x = Fecha3, y = T, colour="P"), size=0.71) +
geom_line(mapping = aes(x = Fecha3, y = Tmax, colour="Max"), size=0.71) +
scale_x_continuous(breaks = as.integer(names(labs)), labels = date_lab, expand = (c(0.001,0.008))) +
scale_y_continuous(breaks=seq(-4, 28, 2), limits = c(1,18), expand=c(0,0)) +
scale_colour_manual(name="Leyenda",
values=c(Min="green", P="#56B4E9", Max="Red")) +
ylab("Temperatura (C)")+
xlab("Tiempo") +
guides(colour=guide_legend(order = 2),
shape=guide_legend(order = 2)) +
polish
w2
Second result is:第二个结果是:
Using the same code but graphing a lot of data I have this problem:使用相同的代码但绘制大量数据我有这个问题:
How I can adjust this axix X?我如何调整这个 axix X? Thank you.
谢谢你。
First question was to remove the "gaps" in your data.第一个问题是删除数据中的“空白”。 As I said, the simplest solution would be facetting by eg year.
正如我所说,最简单的解决方案是按年份分面。 This would allow you to work with a date scale.
这将允许您使用日期刻度。
Your second problem is related to the overplotting of labels.您的第二个问题与标签的过度绘制有关。 This kind of overplotting naturally arises with dates when trying to plot single days.
当试图绘制单日时,这种过度绘制自然会随着日期出现。 With a lot of days, say one year or more it is simply not possible to label all days.
有很多天,比如一年或更长时间,根本不可能标记所有天。 The solution therefore is to restrict the days to plot.
因此,解决方案是限制绘图的天数。 When working with a date scale this can be easily achieved via some helper function (eg
breaks = breaks_width("1 week")
).当使用日期刻度时,这可以通过一些辅助函数轻松实现(例如,
breaks = breaks_width("1 week")
)。
To mimic this behaviour for the hacky solution I added this code:为了模仿 hacky 解决方案的这种行为,我添加了以下代码:
breaks <- mmp2 %>%
# Plots first, 8th, 15th, ... of day of a month
mutate(days_to_plot = lubridate::day(Fecha) %in% c(1, 8, 15, 22, 29)) %>%
filter(days_to_plot) %>%
pull(Fecha3)
This is not a perfect solution but it reduces the lables to plot considerably.这不是一个完美的解决方案,但它大大减少了要绘制的标签。
So try this with your large dataset:所以用你的大数据集试试这个:
library(ggplot2)
library(scales)
library(dplyr)
library(tibble)
library(lubridate)
mmp2 <- mmp1 %>%
mutate(
year_fecha = as.character(lubridate::year(Fecha)),
Fecha2 = format(Fecha, "%d-%m"),
Fecha2 = forcats::fct_reorder(Fecha2, Fecha)) %>%
arrange(Fecha) %>%
rowid_to_column(var = "Fecha3")
# Put the seem code aside
polish <- theme(text = element_text(size=11)) +
theme(axis.text.x=element_text(angle=45, hjust=1))+
theme(plot.title = element_text(hjust = 0.5))+
theme(panel.background = element_rect(fill = 'white', colour = 'white', size = 1.2, linetype = 7))+
theme(text=element_text(family="sans", face="bold", size=12))+
theme(axis.title.y = element_text(face="bold", family = "sans", vjust=1.5, colour="black", hjust = 0.5, size=rel(1.2)))+
theme(axis.title.x = element_text(face="bold", family = "sans", vjust=0.5, colour="black", size=rel(1.2)))+
theme(axis.text.x = element_text(family= "sans",face = "plain", colour="black", size=rel(1.1)))+
theme(axis.text.y = element_text(family= "sans",face = "plain", colour="black", size=rel(1.1)))+
theme(axis.line = element_line(size = 1, colour = "black"))+
theme(legend.title = element_text(colour="black", size=12, face="bold", family = "arial"))+
theme(legend.key = element_rect(fill = "white"))
# Draw the data as one continuous line
# Hacky solutions with some manual labelling
labs <- select(mmp2, Fecha3, Fecha2) %>%
tibble::deframe()
date_lab <- function(x) {
labs[as.character(x)]
}
# Which detas/days should be shown on x-axis
breaks <- mmp2 %>%
# Plots first, 8th, 15th, ... of day of a month
mutate(days_to_plot = day(Fecha) %in% c(1, 8, 15, 22, 29)) %>%
filter(days_to_plot) %>%
pull(Fecha3)
w4 <- ggplot(data = mmp2) +
geom_line(mapping = aes(x = Fecha3, y = Tmin, colour="Min"), size=0.71) +
geom_line(mapping = aes(x = Fecha3, y = T, colour="P"), size=0.71) +
geom_line(mapping = aes(x = Fecha3, y = Tmax, colour="Max"), size=0.71) +
scale_x_continuous(breaks = breaks, labels = date_lab, expand = (c(0.001,0.008))) +
scale_y_continuous(breaks=seq(-4, 28, 2), limits = c(1,18), expand=c(0,0)) +
scale_colour_manual(name="Leyenda",
values=c(Min="green", P="#56B4E9", Max="Red")) +
ylab("Temperatura (C)")+
xlab("Tiempo") +
guides(colour=guide_legend(order = 2),
shape=guide_legend(order = 2)) +
polish
w4
Created on 2020-03-29 by the reprex package (v0.3.0)由reprex 包(v0.3.0) 于 2020 年 3 月 29 日创建
If you still have problems with overplotting, then increas the width between lables or try the new guide_axis
function introduced in ggplot 3.3.0, eg如果你仍然有
guide_axis
问题,那么增加标签之间的宽度或尝试ggplot 3.3.0中引入的新guide_axis
函数,例如
scale_x_continuous(breaks = breaks, labels = date_lab, expand = (c(0.001,0.008)), guide = guide_axis(n.dodge = 2))
will split the lables on two rows.将标签分成两行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.