функции построения графиков с закрашенными точечными символами и легендой

Я хочу изобразить две функции разными цветами и стилями точек с соответствующей легендой простым R.

У меня несколько вопросов:

  1. Я использую pch=21 и pch=22. Насколько я понимаю, это «заполненные» символы. В легенде они кажутся заполненными, как и ожидалось, но на самом графике они кажутся пустыми. Что случилось?

  2. Могу ли я увеличить расстояние между точками, не задавая сетку вручную? может быть, выбрав количество точек для печати?

  3. Не стесняйтесь добавлять любые советы, которые захотите. Я новичок в R. В частности, есть ли лучший способ построить две функции? например определяя векторы функций? и разве не было бы способа автоматически сгенерировать легенду без указания цвета и формы в простом R?

Вот мой код:

par(new=TRUE)
p1 <- plot(function(x){ x^(2)/2 }
       , 0, 100
       , xlab = "x"
       , ylab = "y"
       , ylim = c(0,5000)
       , las = 1
       , type = "p"
       , cex = 0.8
       , pch = 21
       , col = "red"
)
par(new=TRUE)
p2 <- plot(function(x){ (1-x^(2))/2 }
       , 0, 100
       , xlab = ""
       , ylab = ""
       , axes = FALSE
       , type = "p"
       , cex = 0.8
       , pch = 22
       , col = "blue"
)
par(new=TRUE)
l <- legend( "topleft"
         , inset = c(0,0.4) 
         , cex = 1.5
         , bty = "n"
         , legend = c("A", "B")
         , text.col = c("red", "blue")
         , pt.bg = c("red","blue")
         , pch = c(21,22)
)

После различных исследований я решил использовать par(new=TRUE) "трюк" для совмещения двух функций (вместо, скажем, использования matplot или комбинации графика и точек или макета). Было ли это плохим шагом для начала? (Edit: да, очень плохо, см. Ниже) +1, если вы не просите меня прочитать руководство ;-)

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

Изменить: сводка решений

Благодаря Йорану и Дидзису Эльфертс я решил несколько своих проблем. Для записи я хотел бы резюмировать здесь:

  1. Чтобы получить закрашенные символы на графике, необходимо указать как col (цвет), так и bg (фон). Это верно даже для pch=21 и pch=22, которые не заполняются автоматически указанным цветом. Чтобы символы в легенде закрашивались, необходимо указать как col, так и pt.bg. Здесь одного только bg недостаточно.

  2. очень плохая идея использовать par(new=TRUE) с axes=FALSE, как я сделал изначально, потому что наложенные графики не обязательно используют одну и ту же систему координат. Предполагаемая функция для второго графика была (100^2-x^2)/2, но я случайно написал (1-x^2)/2 и не осознал этого, потому что я установил оси = FALSE.

В общем, вот мое предпочтительное решение:

curve( x^2/2
  , from = 0
  , to = 100
  , n = 30
  , type = "p"
  , pch = 21 # alternatively pch=15 is a solid symbol
  , col = "red" # colors the outline of hollow symbol pch=21
  , bg = "red" # fills hollow symbol pch=21 with color
  , xlab = "x"
  , ylab = "y"
)
curve( (100^2-x^2)/2
  , from = 0
  , to = 100
  , n = 30
  , type = "p"
  , pch = 22  # alternative pch=16
  , col = "blue"
  , bg = "blue"
  , add = TRUE
)
legend( "topleft"
  , inset = c(0,0.4), 
  , cex = 1.5, 
  , bty = "n", 
  , legend = c("A", "B"), 
  , text.col = c("red", "blue"),
  , col = c("red", "blue"), 
  , pt.bg = c("red","blue")
  , pch = c(21,22)
)

Это дает сюжет, подобный показанному Джораном. Большое спасибо вам обоим за вашу помощь.


person PatrickT    schedule 04.04.2013    source источник
comment
Вы явно указали легенде заполнить точечные символы, установив pt.bg.   -  person joran    schedule 04.04.2013
comment
Спасибо, Джоран, я этого не осознавал. Если я использую col вместо pt.bg, тогда символы в легенде будут полыми, как и на графике.   -  person PatrickT    schedule 04.04.2013
comment
Да, см. Мой ответ, который касается большинства поднятых вами вопросов.   -  person joran    schedule 04.04.2013
comment
Хорошее резюме! Обратите внимание, что основная цель pch 21 и 22 - это возможность устанавливать разные цвета для контура и заливки каждой точки. Если вы хотите, чтобы отдельная точка имела только один цвет, проще использовать pch 15 и 16. При использовании 15 и 16 вам вообще не нужно беспокоиться о bg и pt.bg.   -  person Gregor Thomas    schedule 05.04.2013
comment
Спасибо, шуджа. Я неправильно это понял. Теперь я понимаю, что искал ТВЕРДЫЙ символ, а не ЗАПОЛНЕННЫЙ. Залитые символы не заполняются автоматически цветом символа. Так что да, палец вверх для pch = 15,16. Джоран намекнул на это в своем ответе, но с первого раза я не понял.   -  person PatrickT    schedule 05.04.2013


Ответы (2)


Я думаю, что, возможно, вам повезет больше, если вы используете curve:

curve(x^(2) / 2,from = 0,to = 100,col = 'red',type = 'p',pch = 16,n = 20)
curve((1-x^(2))/2 + 5000,from = 0,to = 100,col = 'blue',type = 'p',pch = 15,add = TRUE,n = 20)
legend("topleft", 
        inset = c(0,0.4), 
        cex = 1.5, 
        bty = "n", 
        legend = c("A", "B"), 
        text.col = c("red", "blue"),
        col = c("red", "blue"), 
        pch = c(16,15))

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

Обратите внимание, что мне пришлось немного подправить ваши функции, чтобы получить результат, соответствующий вашему изображению.

Чтобы не указывать цвет и заливку по отдельности (что, в общем, и делается в R), я использовал некоторые старые «устаревшие» символы. Использование curve часто намного проще для построения графиков функций или выражений. Это также дает вам более удобный способ указать сетку точек для оценки. У него также есть add аргумент, который позволяет вам пропустить неудобный par взлом, которым вы занимались.

person joran    schedule 04.04.2013
comment
Спасибо, Джоран. Отлично, вы заметили проблему с функциями. В функции есть опечатка, это должно быть plot (function (x) {(100 ^ 2-x ^ 2) / 2}, но я не понимаю, что независимо от того, что я вставляю, plot (function (x) {(1-x ^ 2) / 2} или plot (function (x) {(100 ^ 2-x ^ 2) / 2}, я получаю тот же график! I - person PatrickT; 04.04.2013
comment
Очевидно, что при x = 0 значение синей кривой должно быть 1/2, а не 5000 !! - person PatrickT; 04.04.2013
comment
если это не слишком большая проблема, можете ли вы сказать, что вы получите, если скопируете мой код выше и выполните его? Спасибо! - person PatrickT; 04.04.2013
comment
О, ладно, подождите, я предполагаю, что я запуталась с оператором par (new = TRUE) и не печатаю оси второго графика, позвольте мне проверить это. - person PatrickT; 04.04.2013
comment
@PatrickT Я получаю правильный (то есть другой) вывод для этих двух вызовов сюжета. - person joran; 04.04.2013
comment
@PatrickT FYI - Я использую curve в основном для ясности. plot.function - это просто оболочка для curve. - person joran; 04.04.2013
comment
В чем дело, я знаю, у второго сюжета совершенно другие диапазоны осей. Я предположил, что, будучи наложенными друг на друга, они будут использовать одну и ту же систему координат, но это не так. Это в значительной степени отвечает на мой общий вопрос: мне нужно найти другой подход к наложению графиков, чем использование par (new = TRUE) и скрытие осей !! - person PatrickT; 04.04.2013
comment
Я собираюсь получить ваш ответ, джоран, потому что вы ответили сразу на несколько моих вопросов и, в частности, обнаружили проблему с моим подходом, которой можно было бы избежать, используя кривую вместо графика. (проблема возникла, когда я сначала откалибровал график с разными функциями, затем изменил их, но не проверял, что обе системы координат одинаковы!) - person PatrickT; 05.04.2013
comment
Кстати, я вручную установил ylab, потому что в противном случае автоматически выбранная метка описывает только первую функцию (см. загруженный вами рисунок). - person PatrickT; 05.04.2013

Вы должны добавить аргумент bg="red" или bg="blue" внутри plot(), чтобы получить символы с заливкой определенного цвета.

person Didzis Elferts    schedule 04.04.2013
comment
Спасибо, Дидзис. Итак, что мне делать с утверждением, что pch = 21 и pch = 22 ЗАПОЛНЕНЫ? stat.ethz.ch/R-manual/ R-patched / library / graphics / html / - person PatrickT; 04.04.2013
comment
@PatrickT на этой странице уже упоминалось, что bg = можно использовать для установки заполнения, а col = определяет только границу символа - person Didzis Elferts; 04.04.2013
comment
Спасибо Дидзису, наверное, я неправильно понял значение заполненного ;-) - person PatrickT; 05.04.2013
comment
Еще раз спасибо, Дидзис, на этот раз я выбрал ответ Джорана, потому что нужно было сделать выбор, и он помог мне решить ошибку, которая возникла при использовании par (new = TRUE) с axes = FALSE. Ура, Дидзис. - person PatrickT; 05.04.2013