Затем вы можете использовать pchip для сглаживания других геомов, например, площадных графиков:
аюсь сделать график ударов (какпараллельные координаты но с порядковой осью X), чтобы показать ранжирование во времени. Я могу очень легко сделать линейный график:
library(ggplot2)
set.seed(47)
df <- as.data.frame(as.table(replicate(8, sample(4))), responseName = 'rank')
df$Var2 <- as.integer(df$Var2)
head(df)
#> Var1 Var2 rank
#> 1 A 1 4
#> 2 B 1 2
#> 3 C 1 3
#> 4 D 1 1
#> 5 A 2 3
#> 6 B 2 4
ggplot(df, aes(Var2, rank, color = Var1)) + geom_line() + geom_point()
Замечательно. Теперь я хочу сделать соединительные линии изогнутыми. Несмотря на то, что никогда не было более одного у на х,geom_smooth
предлагает некоторые возможности.loess
Похоже, что это должно работать, так как он может игнорировать точки, кроме ближайших. Тем не менее, даже с лучшей настройкой, которую я могу получить, все равно упускает много очков и обходит другие, где это должно быть плоским:
ggplot(df, aes(Var2, rank, color = Var1)) +
geom_smooth(method = 'loess', span = .7, se = FALSE) +
geom_point()
Я пробовал ряд других сплайнов, таких какggalt::geom_xspline
, но все они по-прежнему промахиваются или пропускают точки:
ggplot(df, aes(Var2, rank, color = Var1)) + ggalt::geom_xspline() + geom_point()
Есть ли простой способ изогнуть эти линии? Нужно ли мне строить свой собственный сигмоидальный сплайн? Чтобы уточнить, я ищу что-то вродеD3.js-хd3.curveMonotoneX
который попадает в каждую точку и чьи локальные максимумы и минимумы не превышают значения y:
В идеале это, вероятно, также имеет наклон 0 в каждой точке, но это не является абсолютно необходимым.