Затем вы можете использовать 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 в каждой точке, но это не является абсолютно необходимым.

Ответы на вопрос(2)

Ваш ответ на вопрос