Вариантов для 2D-графиков (x, y, z) в R немного. Тем не менее, борьба с опциями - это сложная задача, особенно в том случае, если все три являются непрерывными.
Чтобы прояснить проблему (и, возможно, помочь объяснить, почему меня могут споткнуть с contour
или image
), вот возможная схема классификации:
- Случай 1: значение z не указано, но является условной плотностью, основанной на значениях в (x, y). (Примечание: это по существу сводит вычисление z к отдельной функции - оценке плотности. Что-то еще должно использовать результаты этого вычисления, поэтому было бы неплохо учесть произвольные вычисления.)
- Случай 2: (x, y) пары уникальны и расположены через равные интервалы. Это означает, что для каждого значения (x, y) предоставляется только одно значение z.
- Случай 3: (x, y) пары уникальны, но непрерывны. Цвет или затенение по-прежнему определяется только 1 уникальным значением z.
- Случай 4: (x, y) пары не уникальны, а располагаются регулярно. Цвет или затенение определяется функцией агрегирования по значениям z.
- Случай 5: (x, y) пары не являются уникальными, являются непрерывными. Цвет / затенение должны определяться функцией агрегирования по значениям z.
Если я пропускаю некоторые случаи, пожалуйста, дайте мне знать. Случай, который меня интересует, # 5. Некоторые заметки об отношениях:
- Дело № 1 уже хорошо поддерживается.
- Дело № 2 легко поддерживается
heatmap
, image
и функционирует в ggplot
.
- Случай № 3 поддерживается базой
plot
, хотя использование цветового градиента оставлено на усмотрение пользователя.
- Дело № 4 может стать делом № 2 с помощью функции разделения и применения. Я делал это раньше.
- Дело № 5 можно преобразовать в # 4 (а затем # 2) с помощью
cut
, но это не элегантно и квадратно. Шестнадцатеричное биннинг может быть лучше, хотя, кажется, это не может быть легко обусловлено наличием крутого градиента в значении z. Я бы согласился на шестнадцатеричное бинирование, но альтернативные функции агрегирования вполне приветствуются, особенно если они могут использовать значения z.
Как я могу сделать # 5? Вот код для создания седла, хотя значение spread
изменяет разброс значения z, что должно создавать различия в построении градиентов.
N = 1000
spread = 0.6 # Vals: 0.6, 3.0
set.seed(0)
rot = matrix(rnorm(4), ncol = 2)
mat0 = matrix(rnorm(2 * N), ncol = 2)
mat1 = mat0 %*% rot
zMean = mat0[,2]^2 - mat0[,1]^2
z = rnorm(N, mean = zMean, sd = spread * median(abs(zMean)))
Я бы хотел сделать что-то вроде hexbin
, но я справился с этим с ggplot
и не добился большого прогресса. Если бы я мог применить произвольную функцию агрегирования к значениям z в регионе, это было бы еще лучше. (Форма такой функции может быть такой, как plot(mat1, colorGradient = f(z), aggregation = "bin", bins = 50)
.)
Как я могу сделать это в ggplot или другом пакете? Я рад сделать этот вопрос вопросом вики сообщества (или другим пользователям, отредактировав его достаточно много раз). Если да, один ответ на сообщение, пожалуйста, чтобы мы могли сосредоточиться, скажем, на ggplot
, levelplot
, lattice
, contourplot
(или image
) и других параметрах, если они существуют.
Обновления 1: Пример вулкана является хорошим примером случая № 3: данные регулярно располагаются (это может быть широта / долгота), с одним значением z на наблюдение. Топографическая карта имеет (широту, долготу, высоту) и, следовательно, одно значение на местоположение. Предположим, кто-то получает погоду (например, количество осадков, скорость ветра, солнечный свет) в течение многих дней для многих случайно расположенных датчиков: это больше похоже на № 5, чем на № 3 - у нас может быть lat & long, но значения z могут варьироваться совсем немного , даже для тех же или близких (x, y) значений.
Обновление 2: до сих пор ответы от DWin, Kohske и John Colby превосходны. Мой фактический набор данных представляет собой небольшую выборку из большего набора, но при 200 тыс. Точек он дает интересные результаты. На плоскости (x, y) он имеет очень высокую плотность в некоторых регионах (таким образом, в этих областях может произойти переполнение) и гораздо меньшую плотность или полное отсутствие в других регионах. С предложением Джона через fields
мне нужно было отобрать данные для обработки Tps
(я выясню, смогу ли я сделать это без подвыборки), но результаты довольно интересные. При попытке rms
/ Hmisc
(предложение DWin) полные 200К точек, кажется, работают хорошо. Предложение Кохске довольно хорошее, и, поскольку данные преобразуются в сетку перед построением графика, нет проблем с количеством точек входных данных. Это также дает мне большую гибкость, чтобы определить, как агрегировать значения z в регионе. Я еще не уверен, буду ли я использовать среднее, медиану или какую-либо другую совокупность.
Я также собираюсь опробовать хороший пример Кохске с mutate
+ ddply
с другими методами - это хороший пример того, как получить различную статистику, рассчитанную для данного региона.
Обновление 3: различные методы различны, а некоторые замечательны, хотя нет явного победителя. Я выбрал ответ Джона Колби первым. Я думаю, что я буду использовать этот метод или метод DWin в дальнейшей работе.