Разноцветные линии на графике филогении в R

В R я хотел бы сделать несколько графиков, в которых я использую разноцветные линии, как в примерах ниже. Возможно, я мог бы сделать это, используя разные строки, расположенные рядом друг с другом, но проблема в том, что тогда трудно использовать правильную ширину строки, чтобы они располагались точно рядом друг с другом без пробелов между ними (поскольку аргумент lwd строк в графическом пакете R не в абсолютных координатах). Возможно, есть какой-либо другой способ указать, что я хотел бы нарисовать одну линию двумя или тремя (или более) разными цветами? (в идеале углы и заглавные буквы должны выглядеть нормально)

привет, Том

PS приложение, над которым я работаю, должно иметь возможность рисовать филогении с полиморфными состояниями, как на изображении ниже.

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения


person Tom Wenseleers    schedule 19.06.2013    source источник
comment
Этот вопрос немного расплывчатый. Вы должны добавить конкретный пример, который точно иллюстрирует, чего вы пытаетесь достичь (и какой код вы уже написали). Моя единственная мысль на данный момент заключается в том, что вы должны использовать rect, а не строки.   -  person joran    schedule 20.06.2013
comment
Я бы написал алгоритм, который создает либо наборы прямоугольников, либо, что предпочтительнее, многоугольники, которые соответствуют желаемым формам пути. Это не так сложно, как вы думаете :-)   -  person Carl Witthoft    schedule 20.06.2013


Ответы (1)


Из того, что я понял из справки par, параметр lwd отличается от устройства к устройству. Для x11 указано, что ширина линии, контролируемая параметром par(lwd =), кратна 1/96 дюйма. На основе определенного lwd мне нужно было преобразовать эту ширину в единицы x и y графика, чтобы правильно сместить следующие строки.

Итак, теперь у меня есть ваши линии, способные поворачивать за угол - некоторые корректировки линий все еще необходимы, чтобы все они заканчивались одинаковой длины (например, вычесть смещение из последнего значения в серии).

Пример:

x <- c(1:10, rep(1, 10))
y <- c(rep(1, 10), 1:10)
lwd <- 20

x11() #lwd is multiples of 1/96 inches (from help info)

plot(y ~ x, t="l", lend=2, ljoin=2, lwd=lwd, col=3, xlim=c(0,11), ylim=c(0,11))

x.units.per.inch <- (par("usr")[2] - par("usr")[1]) / par("pin")[1]
y.units.per.inch <- (par("usr")[4] - par("usr")[3]) / par("pin")[2]

x.offset <- x.units.per.inch * 1/96 * lwd
y.offset <- y.units.per.inch * 1/96 * lwd

lines(x + x.offset, y + y.offset, lend=2, ljoin=2, lwd=lwd, col=2)
lines(x - x.offset, y - y.offset, lend=2, ljoin=2, lwd=lwd, col=4)

введите здесь описание изображения

person Marc in the box    schedule 19.06.2013
comment
Я думаю, вам нужно продемонстрировать, что ваш подход может правильно свернуть за угол. - person IRTFM; 20.06.2013
comment
Большое спасибо за это - все идет в правильном направлении - только другая проблема, с которой я застрял, заключается в том, как бороться с углами? (даже если в моем случае у меня только прямые углы) Не будет ли проще работать с прямоугольниками, а не с линиями? - person Tom Wenseleers; 20.06.2013
comment
@TomWenseleers - надеюсь, теперь это поможет. Я думаю, что использование rect также потребует смещения, чтобы получить желаемый эффект. Это действительно сложно... - person Marc in the box; 20.06.2013
comment
Большое спасибо за это - это должно заставить меня двигаться - не беспокойтесь! Я просто смотрел на пакет формы, в котором есть функция fillshape, которая позволяет указать пользовательскую форму с пользовательскими цветами заливки с произвольным количеством шагов и произвольным поворотом, предположительно, это тоже может работать... - person Tom Wenseleers; 20.06.2013