Подтвердить что ты не робот

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

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

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

  • Я использую pch=21 и pch=22. Я понимаю, что они "заполнены" символами. Они кажутся заполненными, как ожидалось в легенде, но они кажутся полыми на самом графике. Что не так?

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

  • Не стесняйтесь добавлять какие-либо советы, которые вам нужны. Я очень новичок в Р. В частности, есть ли лучший способ построить две функции? например определяя векторы функций? и не было бы способа, чтобы легенда была автоматически генерирована без необходимости указывать цвета и формы, в простой 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) для наложения двух функций (а не, скажем, с использованием матплота или комбинации графика и точек или макета). Для начала это был неудачный шаг? (Изменить: да, очень плохо, см. Ниже) +1, если вы не просите меня прочитать руководство; -)

enter image description here

Изменить: Резюме решений

Благодаря joran и Didzis Elferts, я получил решение нескольких из моих проблем. Для записи, я хотел бы кратко изложить здесь:

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

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

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

4b9b3361

Ответ 1

Думаю, может быть, вам удастся использовать 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))

enter image description here

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

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

Ответ 2

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