Контролировать размер точек на диаграмме рассеяния R.


117

В R plot()функция принимает pchаргумент, который управляет появлением точек на графике. Я делаю диаграммы рассеяния с десятками тысяч точек и предпочитаю маленькую, но не слишком маленькую точку. В принципе, я считаю pch='.'себя слишком маленьким, но pch=19слишком толстым. Есть что-то посередине или как-то уменьшить масштаб точек?


Вместо того, чтобы делать точки меньше, есть ли способ просто построить график, скажем, 100 случайных точек данных было бы легче увидеть, чем 1000?
user2363642 09

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

1
Предлагаю не использовать pch='.', он будет не по центру. Источник: Раньше использовал pch='.'часто
генеорама

@geneorama Вы имеете в виду использование ·вместо .?
nanaki

@nanaki более или менее, но, как ни странно, ваш символ отображается как крошечные прямоугольники, когда я использую его в R. Ответы ниже хорошо объясняют правильный подход.
geneorama

Ответы:


101

Попробуйте cexаргумент:

?par

  • cex
    Числовое значение, определяющее величину, на которую следует увеличить отображаемый текст и символы относительно значения по умолчанию. Обратите внимание, что некоторые графические функции, такие как plot.default, имеют аргумент с этим именем, который умножает этот графический параметр, а некоторые функции, такие как точки, принимают вектор значений, которые повторно используются. Другие варианты использования будут принимать только первое значение, если указан вектор длины больше единицы.

15
Я не думаю, что когда-либо использовал бы cex для управления размером символа, если бы у меня не было другого варианта. Это работает только иногда; Правило состоит в том, что когда 'cex' устанавливается через 'par', это влияет на размер (большей части) текста на графике, когда установлено внутри 'plot', 'cex' влияет только на размер символа. Поэтому, если вы неправильно примените это правило, не только размер вашего символа не изменится, но и у вас теперь есть несколько параметров, влияющих на размер текста (cex.axis, cex.lab, cex.main и cex.sub - все делают то же самое. работа как cex, только по частям). Такой код сложно поддерживать и расширять.
Дуг

5
Согласен. Настройка cexглобально через parизменения всех видов вещей, в том числе фигурных краев, что вы должны скорректировать. настройка cexвнутри plot, однако, кажется, работает.
вылетает

Совет, изложенный выше в комментарии Дуга, не обязательно неверен, но он значительно преувеличивает любые потенциальные проблемы с использованием cexаргумента при построении графика. Есть очень много случаев, когда это полезно и является лучшим вариантом.
Joran

lwdконтролирует ширину линии pch, например plot(1:5, pch=1:5, col=1:5, lwd=1:5). Спасибо sthda.com/english/wiki/…
geneorama

95

pch = 20 возвращает символ размером от "." и 19.

Это заполненный символ (что, вероятно, вам и нужно).

Кроме того, даже базовая графическая система в R позволяет пользователю детально контролировать размер, цвет и форму символа. Например,

dfx = data.frame(ev1=1:10, ev2=sample(10:99, 10), ev3=10:1)

with(dfx, symbols(x=ev1, y=ev2, circles=ev3, inches=1/3,
                  ann=F, bg="steelblue2", fg=NULL))

Пример графика


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

pi*R^2(поверхность) должна быть пропорциональна количеству наблюдений.
SESman

5
@saratis Это будет делать то, что вы хотите:symbols(x=dfx$ev1, y=dfx$ev2, circles=sqrt(dfx$ev3/pi), inches=1/3, ann=F, bg="steelblue2", fg=NULL)
fmark

1
есть идеи, как я могу использовать это для построения нескольких серий на одном графике? т.е. "точки (x = dfx2 $ ev1, y = dfx2 $ ev2, круги = dfx2 $ ev3, ...)" не работают.
Neodyme

Если вам интересно: «Что такое дюйм?» смотрите здесь
MichaelChirico

22

Как указано в rcs , cexбудет работать в базовом графическом пакете. Я считаю, что вы не желаете делать свой график, ggplot2но если вы это сделаете, есть sizeэстетический атрибут, который вы можете легко контролировать ( ggplot2имеет удобные для пользователя аргументы функции: вместо ввода cex(расширение символов) ggplot2вы можете ввести, например, size = 2и получится точка 2мм).

Вот пример:

### base graphics ###
plot(mpg ~ hp, data = mtcars, pch = 16, cex = .9)

### ggplot2 ###
# with qplot()
qplot(mpg, hp, data = mtcars, size = I(2))
# or with ggplot() + geom_point()
ggplot(mtcars, aes(mpg, hp), size = 2) + geom_point()
# or another solution:
ggplot(mtcars, aes(mpg, hp)) + geom_point(size = 2)

4
И, если вы действительно рисуете десятки тысяч точек, у ggplot2 есть несколько альтернативных способов сделать это красивым - корректировка альфа, шестигранные ячейки, контурные графики и т. Д. Посмотрите страницы 72-77 книги ggplot2, если таковой имеется в вашей библиотеке или если у вашей библиотеки есть электронный доступ к книгам Springer (я думаю, что большинство книг R там).
Мэтт Паркер

Ага ... Я особенно использую alphaв диаграммах рассеяния, чтобы избежать перерисовки.
aL3xa 05

@ aL3xa Вы можете использовать альфа- канал в базовом графическом пакете. Просто добавьте, например, col = rgb(0, 0, 0, 0.6)в параметры сюжета.
RobJan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.