Quando ploto meus dados sem definir explicitamente o intervalo de coordenadas x (o quarto e mais baixo gráfico na captura de tela, "Sonntag"), o programa par("usr")
me informa qual intervalo o R usa por padrão:
> par("usr")
[1] -68.912 1797.112 0.000 87.400
Mas quando defino o intervalo de coordenadas x para esses valores usando xlim = c(-68.912, 1797.112)
, o gráfico fica mais estreito (o terceiro gráfico na captura de tela, "Samstag"). E quando defino um intervalo mais estreito que o padrão, o eixo x se estende além da janela do gráfico (o primeiro e o segundo gráficos na captura de tela).
Os dados no eixo x são um fator:
steps$time <- factor(format(steps$start_time, "%H:%M"),
levels = format(seq(as.POSIXct("2020-02-20 00:00:00"),
as.POSIXct("2020-02-20 23:59:00"),
by = "1 min"),
"%H:%M"
)
)
Quero limitar o gráfico ao "tempo" entre 6h e 23h, que deve corresponder aos níveis de fator 360 e 1380 (usados nos dois gráficos superiores). Como posso fazer isso?
Aqui está o código completo do enredo:
par(mfrow = c(4, 1), mar = c(5.1, 2.1, 4.1, 2.1))
barplot(count ~ time, dat[dat$group == "A",], xlim = c(360, 1380), ylim = c(0, max(dat$count)), col = "violet", border = NA, xlab = "", ylab = "", yaxt = "n", main = "Montag bis Donnerstag")
barplot(count ~ time, dat[dat$group == "B",], xlim = c(360, 1380), ylim = c(0, max(dat$count)), col = "violet", border = NA, xlab = "", ylab = "", yaxt = "n", main = "Freitag")
barplot(count ~ time, dat[dat$group == "C",], xlim = c(-68.912, 1797.112), ylim = c(0, max(dat$count)), col = "violet", border = NA, xlab = "", ylab = "", yaxt = "n", main = "Samstag")
barplot(count ~ time, dat[dat$group == "D",], ylim = c(0, max(dat$count)), col = "violet", border = NA, xlab = "", ylab = "", yaxt = "n", main = "Sonntag")
Os dados estão aqui: https://pastebin.com/tnNwFywX
Por padrão, os limites do eixo são estendidos em 4%, quando
par("xaxs")
for igual a"r"
. Você pode defini-lo como ,"i"
caso em que ele não estenderá os limites e tentará encontrar pontos de corte justos entre os valores. No seu caso, como você definiutime
como um fator, a maneira mais fácil de fazer isso acontecer, eu acho, é subdividir os dados edroplevels()
usartime
.Você está enfrentando o problema, que
barplot
também plota níveis não utilizados, e é por isso que @DaveArmstrong usoudroplevels
. Aqui está um pequeno exemplo para ilustrar isso:Observe que, em
barplot
, o eixo x denota os índices de barra {1, 2, ..., n}, e as posições são retornadas de forma invisível, o que você pode explorar aqui. Para obter rótulos de tempo interessantes, force os tempos dos fatores para caracteres que são facilmente subconfiguráveis usando operadores relacionais como>= '06:00'
e . Isso também funciona em ordem alfabética. Você não precisaráxlim
de then, que pode ser tedioso de usar neste caso.No entanto, é crucial usar
ylim
todo o intervalo de contagem para tornar os gráficos de barras comparáveis.Você também pode transformar o grupo em um fator com os rótulos de dias correspondentes, o que ajudará ao usar um
for
loop.Certifique-se de que não há "buracos" nos dados, ou seja, os horários realmente estão entre 6 e 23 horas e, de outra forma, têm intervalos iguais, conforme especificado no OP, por exemplo, por meio de uma verificação como:
Por fim, basta usar
endsWith()
para encontrar as horas completas.