Как придать столбцам гистограммы определенного цвета в зависимости от значения элементов ggplot r

При правильной комбинации $ lookup, $ project и $ match вы можете присоединиться к нескольким таблицам по нескольким параметрам. Это связано с тем, что они могут быть связаны несколько раз.

Предположим, что мы хотим сделать следующее ( reference )

SELECT S.* FROM LeftTable S
LEFT JOIN RightTable R ON S.ID =R.ID AND S.MID =R.MID WHERE R.TIM >0 AND 
S.MOB IS NOT NULL

Шаг 1: Свяжите все таблицы

, вы можете $ lookup сколько угодно таблиц.

$ lookup - по одному для каждой таблицы в запросе

$ unwind - поскольку данные денормализированы правильно, иначе они завернуты в массивы

Python code ..

db.LeftTable.aggregate([
                        # connect all tables

                        {"$lookup": {
                          "from": "RightTable",
                          "localField": "ID",
                          "foreignField": "ID",
                          "as": "R"
                        }},
                        {"$unwind": "R"}

                        ])

Шаг 2: Определите все условные выражения

$ project: определите здесь все условные операторы и все переменные, которые вы хотите выбрать.

Python Code ..

db.LeftTable.aggregate([
                        # connect all tables

                        {"$lookup": {
                          "from": "RightTable",
                          "localField": "ID",
                          "foreignField": "ID",
                          "as": "R"
                        }},
                        {"$unwind": "R"},

                        # define conditionals + variables

                        {"$project": {
                          "midEq": {"$eq": ["$MID", "$R.MID"]},
                          "ID": 1, "MOB": 1, "MID": 1
                        }}
                        ])

Шаг 3: Присоедините все условные обозначения

$ match - присоедините все условия, используя OR или AND и т. д. Их могут быть кратные ,

$ project: undefine all conditionals

Python Code ..

db.LeftTable.aggregate([
                        # connect all tables

                        {"$lookup": {
                          "from": "RightTable",
                          "localField": "ID",
                          "foreignField": "ID",
                          "as": "R"
                        }},
                        {"$unwind": "$R"},

                        # define conditionals + variables

                        {"$project": {
                          "midEq": {"$eq": ["$MID", "$R.MID"]},
                          "ID": 1, "MOB": 1, "MID": 1
                        }},

                        # join all conditionals

                        {"$match": {
                          "$and": [
                            {"R.TIM": {"$gt": 0}}, 
                            {"MOB": {"$exists": True}},
                            {"midEq": {"$eq": True}}
                        ]}},

                        # undefine conditionals

                        {"$project": {
                          "midEq": 0
                        }}

                        ])

Практически любая комбинация таблиц, условных обозначений и объединений может быть выполнена таким образом ,

0
задан Activation 17 March 2019 в 19:13
поделиться

2 ответа

Во-первых, я бы настоятельно рекомендовал поискать чит-листы для R, которые очень удобно размещены здесь

Я лично больше привык писать полную версию функции ggplot, потому что она более ясно, когда вы лучше познакомитесь с этой библиотекой.

Задача
Сначала вам нужно понять идею, лежащую в основе гистограмм, гистограммы работают, когда у вас нет значения и вы хотите рассчитать количество или плотность некоторых характеристик. В вашем случае вам просто нужны простые точки для представления значений, которые у вас уже есть в вашем фрейме данных. Это легко сделать с некоторым пониманием ggplot.

Эстетика
При использовании функции ggplot () требуются некоторые основные аргументы.

ggplot(data = NULL, mapping = aes(), ..., environment = parent.frame())  

Данные, которые вы предоставляете, представляют собой целые кадры beta_0jk. Сопоставление соответствует элементам, которые вы определяете своими столбцами, поэтому вам необходимо указать их:

x - что-то для группировки по вашим значениям, я бы сказал, что вы захотите «Car» здесь, чтобы указать модель
y - это должно быть ясно - «Value» - это переменная, которую вы измеряете, поэтому вы выбрали ее для представления значения оси y
[1119 ] col - это снова GROUP, но она работает не так, как x - она ​​делает разные цвета для каждой указанной вами группы. Чтобы использовать его, вы должны убедиться, что ваш столбец является фактором

Реализация

ggplot2::ggplot(beta_0jk,ggplot2::aes(
  x = Car,
  y = Value,
  col = Country)
) + geom_jitter()

Начните с этого и используйте шпаргалку ggplot2, чтобы сделать вашу работу результат, потому что, если честно, я не знаю, что вы хотите показать с энтузиазмом. Я также рекомендую поискать библиотеки dplyr и tidyr

0
ответ дан Krzysztof Nowicki 17 March 2019 в 19:13
поделиться

Это то, что вы ищете? Чтобы все бары были одинаковой ширины, мне пришлось заполнить data дополнительной строкой, поскольку в Car == 'BMW X5' нет Country == 'US'. Канал подготовки данных %>% был полностью вдохновлен в на этот ответ .

library(tidyverse)
library(ggplot2)


data %>% 
  spread(key = Car, value = Value, fill = NA) %>% 
  gather(key = Car, value = Value, -Country) %>% 
  ggplot(aes(x = Car, y = Value, fill = Country)) +
  geom_col(position = position_dodge())

Данные.

data <- read.table(text = "
Car      Country      Value
'Audi A6'  US           23
'Audi A6'  UK           12
'Audi A6'  DE           19
'BMW X5'   UK           8
'BMW X5'   DE           5
", header = TRUE)
0
ответ дан Rui Barradas 17 March 2019 в 19:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: