Хитрость использования функций панели в pairs
находится в help(pairs)
:
Функция панели не должна пытаться начать новый график, а должна просто строить график в заданной системе координат: таким образом, «график» и «блочный график» не являются функциями панели.
Таким образом, вы должны использовать графические функции добавления, такие как points
, lines
, polygon
или, возможно, (если доступно) plot(..., add=TRUE)
, но не прямой график. То, что вы предлагали в своем комментарии (с SpatialPolygons
), могло бы сработать с некоторым подталкиванием, если бы вы на самом деле пытались построить его на тисках устройства, просто возвращая его из своей функции построения графика.
В приведенном ниже примере я на самом деле «создаю новый график», но я обманываю (на основе этот пост SO), добавив второй график поверх уже существующего. Я делаю это, чтобы сократить необходимый в противном случае масштаб/сдвиг, который все равно не будет идеальным, поскольку вам, кажется, нужен «идеальный круг», что на самом деле может быть гарантировано только с asp=1
(соотношение сторон фиксировано на 1: 1).
colorRange <- c('#69091e', '#e37f65', 'white', '#aed2e6', '#042f60')
## colorRamp() returns a function which takes as an argument a number
## on [0,1] and returns a color in the gradient in colorRange
myColorRampFunc <- colorRamp(colorRange)
panel.cor <- function(w, z, ...) {
correlation <- cor(w, z)
## because the func needs [0,1] and cor gives [-1,1], we need to
## shift and scale it
col <- rgb( myColorRampFunc( (1+correlation)/2 )/255 )
## square it to avoid visual bias due to "area vs diameter"
radius <- sqrt(abs(correlation))
radians <- seq(0, 2*pi, len=50) # 50 is arbitrary
x <- radius * cos(radians)
y <- radius * sin(radians)
## make them full loops
x <- c(x, tail(x,n=1))
y <- c(y, tail(y,n=1))
## I trick the "don't create a new plot" thing by following the
## advice here: http://www.r-bloggers.com/multiple-y-axis-in-a-r-plot/
## This allows
par(new=TRUE)
plot(0, type='n', xlim=c(-1,1), ylim=c(-1,1), axes=FALSE, asp=1)
polygon(x, y, border=col, col=col)
}
pairs(mtcars, upper.panel=panel.cor)
![введите здесь описание изображения](https://i.stack.imgur.com/YJ6GU.png)
Вы можете манипулировать размером кругов — за счет беспристрастной визуализации — играя с радиусом. Цвета я взял прямо со страницы, на которую вы изначально ссылались.
Аналогичные функции можно использовать для нижних и диагональных панелей.
person
r2evans
schedule
07.08.2015
?pairs
, особенно сlower.panel
,diag.panel
иupper.panel
; это позволит вам воссоздать все, кроме градиентной полосы справа (которую вы можете воссоздать множеством способов). - person r2evans   schedule 30.07.2015pch
в пределахtext
, свободно контролируя его радиус с помощьюcex
, но это немного неаккуратно и неточно. Я не думаю, что в базовой графике R есть автоматический круг, и хотя некоторые вспомогательные пакеты могут сделать это за вас, я часто просто прибегаю к паре вызововpolygon
илиline
иsin
/cos
, возвращая ко временам базовой тригонометрии.legend
не может сделать такую цветовую полосу. - person r2evans   schedule 31.07.2015panel.cor <- function(w, z, ...) { usr <- par("usr"); on.exit(par(usr)); par(usr = c(0, 1, 0, 1)); abs.r <- abs(cor(w, z)); pts = seq(0, 2 * pi, length.out = 100); xy = cbind(0.5 + abs.r * sin(pts), 0.5 + abs.r * cos(pts)); SpatialPolygons(list(Polygons(list(Polygon(xy)), "polygon"))); }
К сожалению, это не работает. Честно говоря, я не на 100% знаком с функциями в R. Я думаю, что эта функция не работает, потому что она не находит центр каждого графика, но я не уверен. Не могли бы вы помочь? Ваше здоровье! - person RodGob   schedule 07.08.2015SpatialPolygons
, которые (на мой взгляд) здесь значительно излишни. (Почему бы просто не использоватьlines
и/илиpolygon
?) - person r2evans   schedule 07.08.2015