#r #annotations #plotly #forestplot
#r #аннотации #plotly #forestplot
Вопрос:
Исправлена опечатка в коде, так что теперь она должна быть воспроизводимой
Я новичок в публикации в StackOverflow, поэтому, пожалуйста, дайте мне знать, если мой вопрос или пример недостаточно понятны, и я добавлю дополнительную информацию по мере необходимости.
Я пытаюсь разработать лесной участок в R
использовании plotly
. Для этого мне нужно иметь возможность размещать текст вдоль оси y, как если бы это была форматированная таблица (содержимое столбца должно быть выровнено по левому краю для текста, по правому краю для чисел, см. Пример Здесь). Моим первоначальным решением было иметь одну длинную форматированную строку на галочку по оси y (с использованием форматирования печати). Это работает, но только для моноширинного шрифта.
Итак, теперь я пытаюсь использовать аннотации вместо меток оси y. Трудность заключается в правильном размещении каждой аннотации / столбца за пределами области построения, чтобы создать желаемое форматирование. Сначала я хотел найти самую широкую строку в столбце и соответственно вычислить нормализованные координаты, но у меня нет опыта в этом, поэтому, хотя я мог заставить аннотации отображаться в виде столбцов, выровненных по левому краю, мои преобразования были неправильными, а пробелы между столбцами были большими. Вот что я использовал, чтобы попытаться вычислить координаты. Если вы можете указать мне на другие функции для этого или знаете, как я могу работать с этими координатами, это определенно было бы моим предпочтительным решением. Обратите внимание, что количество столбцов, которые будут отображаться слева / справа от графика, будет выбираться пользователем динамически, поэтому поля графика также должны иметь возможность регулировки. И я считаю, что они должны быть указаны в пикселях, поэтому это приводит к другому преобразованию из нормализованных координат в пиксели…
longestMpg = max(strwidth(mtcars$mpg, unit = 'in'))
coord = grconvertX(longestMpg, from = 'inches', to = 'ndc') #normalized device coordinates
# coord = grconvertX(longestNames, from = 'inches', to = 'npc') # normalized plot coordinates
# coord = grconvertX(longestNames, from = 'inches', to = 'nfc') # normalized figure coordinates
Итак, теперь я перешел к размещению каждого столбца / аннотации на отдельном графике x = 0
и к попытке объединить их в один подзаголовок в конце (не очень элегантный обходной путь …). Проблема здесь в том, что текст отображается выровненным по левому краю для каждого графика отдельно (на данный момент я не пытаюсь смешивать текст, выровненный по левому краю и выровненный по правому краю), но как только я помещаю оба графика в один подзаголовок, текст на втором графике выравнивается по центру. Вот очень простой пример:
library(plotly)
# Plot only mtcar$disp
aPlot = plotly_empty(mtcars, type = "scatter", mode = "markers") %>%
config(
displayModeBar = FALSE
)
for (i in 1:nrow(mtcars)) {
aPlot = aPlot %>% add_annotations(x = 0,
y = i,
text = mtcars$disp[i],
xref = 'paper',
yref = 'y',
showarrow = F) %>%
layout(yxaxis = list(showline = T), yaxis = list(showline = T))
}
# Plot only mtcar rownames
bPlot = plotly_empty(mtcars, type = "scatter", mode = "markers") %>%
config(
displayModeBar = FALSE
)
for (i in 1:nrow(mtcars)) {
bPlot = bPlot %>% add_annotations(x = 0,
y = i,
text = rownames(mtcars)[i],
xref = 'paper',
yref = 'y',
showarrow = F) %>%
layout(yxaxis = list(showline = T), yaxis = list(showline = T))
}
# Subplot
subplot(aPlot, bPlot, shareX = T, shareY = F)
Возможно, есть более простой и элегантный способ достичь того, что я ищу, и я рад узнать что-то новое, поэтому, пожалуйста, не стесняйтесь делиться своими идеями.
Благодарен за любую помощь!
Комментарии:
1. Добро пожаловать в stackoverflow! К сожалению, ваш вопрос не воспроизводим. Пожалуйста, поделитесь
dput(plotData)
dput(head(plotData))
с нами результатами or. Что касаетсяcolumn content should be left-aligned for text, right-aligned for numbers
вашего примера, все столбцы выровнены по левому краю? Кстати. знаете ли вы о таблицах plotly?2. Спасибо, что перезвонили мне @ismirsehregal. Моя ошибка — заменить
plotData
наmtcars
и это должно сработать (plotData — это исходный набор данных, которым я не могу поделиться здесь, поэтому я использовал mtcars, чтобы попытаться проиллюстрировать). Конечная цель — быть гибким и комбинировать выравнивание. На данный момент я просто счастлив, если смогу выяснить, как выровнять все по левому или правому краю. Я не знал таблиц plotly. Это выглядит как очень хорошее решение, если я смогу выяснить, как точно выровнять строки таблицы с данными, чтобы таблица выглядела так, как если бы она была аннотацией для графика.