1) Есть ли какая-либо библиотека / функция R, которая будет реализовывать размещение меток INTELLIGENT на графике R? Я пробовал некоторые, но все они проблематичны - многие метки перекрывают друг друга или другие точки (или другие объекты на графике, но я вижу, что с этим намного труднее справиться).
2) Если нет, есть ли способ УДОБНО помочь алгоритму с размещением меток для определенных проблемных точек? Требуется максимально удобное и эффективное решение.
Вы можете поиграть и протестировать другие возможности на моем воспроизводимом примере и посмотреть, сможете ли вы добиться лучших результатов, чем я:
# data
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012,
0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542,
0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho",
"SaxRub", "TurMer", "TurPil", "TurPhi")
# basic plot
plot(x, y, asp=1)
abline(h = 1, col = "green")
abline(v = 1, col = "green")
Для маркировки я затем попробовал эти возможности, никто не особо хорош:
1) это ужасно:
text(x, y, labels = ShortSci, cex= 0.7, offset = 10)
2) этот хорош, если вы не хотите ставить метки для всех точек, а только для выбросов, но все же метки часто размещаются неправильно:
identify(x, y, labels = ShortSci, cex = 0.7)
3) этот выглядел многообещающе, но есть проблема с ярлыками, которые слишком близко расположены к точкам; Мне пришлось заполнить их пробелами, но это мало помогает:
require(maptools)
pointLabel(x, y, labels = paste(" ", ShortSci, " ", sep=""), cex=0.7)
4)
require(plotrix)
thigmophobe.labels(x, y, labels = ShortSci, cex=0.7, offset=0.5)
5)
require(calibrate)
textxy(x, y, labs=ShortSci, cx=0.7)
Заранее спасибо!
РЕДАКТИРОВАТЬ : задача : попробуйте labcurve {Hmisc} .
install.packages("FField")
library(FField)
FFieldPtRepDemo()
Ответы:
Во-первых, вот результаты моего решения этой проблемы:
Я сделал это вручную в Preview (очень простая программа просмотра PDF / изображений в OS X) всего за несколько минут. ( Изменить: рабочий процесс был именно таким, как вы ожидали: я сохранил график как PDF-файл из R, открыл его в предварительном просмотре и создал текстовые поля с желаемыми метками (9pt Helvetica), а затем просто перетащил их с помощью мыши, пока они не посмотрели хорошо. Затем я экспортировал в PNG для загрузки в SO.)
Теперь, прежде чем вы поддадитесь сильному побуждению проголосовать за это до забвения и оставить язвительные комментарии о том, как автоматизировать этот процесс, выслушайте меня!
Искать алгоритмические решения - это нормально и (ИМХО) действительно интересно. Но для меня ситуации с маркировкой точек можно разделить примерно на три категории:
text
) не являются , что много усилий.: забраться на мыльницу:
Поскольку такие люди, как мы, любят автоматизацию, я думаю, что мы часто попадаем в ловушку, полагая, что почти каждый аспект создания хорошей статистической графики должен быть автоматизирован. Я уважительно (скромно!) Не согласен.
Не существует совершенно общей среды статистического построения графиков, которая автоматически создает картину, которая у вас в голове. Такие вещи, как R, ggplot2, lattice и т. Д., Делают большую часть работы; но эта дополнительная небольшая настройка, добавление линии здесь, настройка поля там, вероятно, лучше подходит для другого инструмента.
: слезая из мыльницы:
Я также хотел бы отметить, что я думаю, что мы все могли бы придумать диаграммы рассеяния с <10-15 точками, которые будет почти невозможно точно пометить даже вручную, и они, вероятно, сломают любое автоматическое решение, которое кто-то придумает.
Наконец, я хочу повторить, что знаю, что это не тот ответ, который вы ищете. И я не говорю, что алгоритмические попытки бесполезны или тупы. Я проголосовал за этот вопрос и с радостью проголосую за интересные алгоритмические решения!
Причина, по которой я опубликовал этот ответ, заключается в том, что я думаю, что этот вопрос должен быть каноническим вопросом о «маркировке точек в R» для будущих дубликатов, и я думаю, что решения, связанные с ручной маркировкой, заслуживают места за столом, вот и все.
источник
ggrepel
выглядит многообещающим в применении кggplot2
диаграммам рассеяния.источник
Вы пробовали пакет directlabels ?
И, кстати, аргументы pos и offset могут принимать векторы, чтобы вы могли разместить их в правильных положениях, когда есть разумное количество точек всего за несколько прогонов графика.
источник
plot()
? У меня не получилось, поэтому ... Спасибо! PS: @SpacedMan & Ben, я убрал свои комментарии по поводу обновления R, так как они не так интересны - вы можете сделать то же самое.Я нашел какое-то решение! К сожалению, он не идеален и не идеален, но сейчас мне больше всего подходит. Это наполовину алгоритм, наполовину ручной, поэтому он экономит время по сравнению с чисто ручным решением, предложенным Джораном.
Я упустил из виду очень важную часть
?identify
помощи!Поэтому, если вы используете
identify()
решение, как я написал в своем вопросе, вы можете повлиять на положение метки, не щелкая непосредственно в этой точке, а щелкая рядом с этой точкой относительно в желаемом направлении !!! Работает просто отлично!Обратной стороной является то, что есть только 4 позиции (верхняя, левая, нижняя, правая), но я бы больше ценил другие 4 (верхняя левая, верхняя правая, нижняя левая, нижняя правая) ... Итак, я используйте это для обозначения точек, где это меня не беспокоит, и остальных точек, которые я помечаю непосредственно в своей презентации Powerpoint, как предложил Джоран :-)
PS: Я еще не пробовал решение directlabels lattice / ggplot, я все еще предпочитаю использовать базовую библиотеку графиков.
источник
Предлагаю вам взглянуть на
wordcloud
посылку. Я знаю, что этот пакет фокусируется не на точках, а на самих этикетках, а также стиль кажется довольно фиксированным. Но все же результаты, которые я получил от его использования, были довольно ошеломляющими. Также обратите внимание, что рассматриваемая версия пакета была выпущена примерно в то время, когда вы задали вопрос, поэтому она все еще очень новая.http://blog.fellstat.com/?cat=11
источник
Я написал функцию R, вызываемую
addTextLabels()
внутри пакетаbasicPlotteR
. Пакет можно напрямую установить в вашу библиотеку R, используя следующий код:В представленном примере я использовал следующий код для создания приведенного ниже примера рисунка.
Он работает, автоматически выбирая альтернативное местоположение из точной сетки точек. Ближайшие точки сетки просматриваются первыми и выбираются, если они не перекрываются с нанесенными точками или метками. Если вам интересно, посмотрите исходный код .
источник
Не ответ, но слишком длинный для комментария. Очень простой подход, который может работать с простыми случаями, где-то между пост-обработкой Джорана и более сложными алгоритмами, которые были представлены, - это выполнение
in-place
простых преобразований в фрейм данных.Я проиллюстрирую это,
ggplot2
потому что я более знаком с этим синтаксисом, чем с базовыми графиками R.Как видите, в данном случае результат не идеален, но для некоторых целей его может хватить. И это довольно легко, обычно достаточно чего-то подобного.
within(df, y <- y+.01)
источник
df
использованиеwithin
, я часто делаю это, корректируя эстетику:geom_text(aes(x = x - .01, y = y + .01), hjust = 0, vjust = 0)
кажется чище.