Контролировать размер точек на диаграмме рассеяния 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)
aL3xa
источник
4
И, если вы действительно рисуете десятки тысяч точек, у ggplot2 есть несколько альтернативных способов сделать это красивым - корректировка альфа, шестигранные ячейки, контурные графики и т. Д. Посмотрите страницы 72-77 книги ggplot2, если таковой имеется в вашей библиотеке или если у вашей библиотеки есть электронный доступ к книгам Springer (я думаю, что большинство книг R там).
Мэтт Паркер
Ага ... Я особенно использую alphaв диаграммах рассеяния, чтобы избежать перерисовки.
aL3xa 05
@ aL3xa Вы можете использовать альфа- канал в базовом графическом пакете. Просто добавьте, например, col = rgb(0, 0, 0, 0.6)в параметры сюжета.
RobJan