С помощью collections.Counter
вы можете сделать
>>> import collections
>>> stats = {'a':1000, 'b':3000, 'c': 100}
>>> stats = collections.Counter(stats)
>>> stats.most_common(1)
[('b', 3000)]
. Если нужно, вы можете просто начать с пустого collections.Counter
и добавить к нему
>>> stats = collections.Counter()
>>> stats['a'] += 1
:
etc.
Для небольшого числа переменных вы можете сами создать сборку вручную:
ggplot(test_data, aes(date)) +
geom_line(aes(y = var0, colour = "var0")) +
geom_line(aes(y = var1, colour = "var1"))
Вам нужны данные, которые должны быть в «высоком» формате вместо «wide» для ggplot2. «широкий» означает наличие наблюдения за строку с каждой переменной в виде другого столбца (как и у вас сейчас). Вам нужно преобразовать его в «высокий» формат, где у вас есть столбец, который сообщает вам имя переменной и другой столбец, в котором указывается значение переменной. Процесс перехода от широкого к высокому обычно называют «плавлением». Вы можете использовать tidyr::gather
для растапливания вашего фрейма данных:
library(ggplot2)
library(tidyr)
test_data <-
data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
)
test_data %>%
gather(key,value, var0, var1) %>%
ggplot(aes(x=date, y=value, colour=key)) +
geom_line()
Просто чтобы очистить data
, который ggplot
потребляет после того, как трубопровод через gather
выглядит следующим образом:
date key value
2002-01-01 var0 100.00000
2002-02-01 var0 115.16388
...
2007-11-01 var1 114.86302
2007-12-01 var1 119.30996
Использование ваших данных:
test_data <- data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
Dates = seq.Date(as.Date("2002-01-01"), by="1 month", length.out=100))
Я создаю сложную версию, с которой ggplot()
хотел бы работать с:
stacked <- with(test_data,
data.frame(value = c(var0, var1),
variable = factor(rep(c("Var0","Var1"),
each = NROW(test_data))),
Dates = rep(Dates, 2)))
В этом случае создание stacked
было довольно просто, поскольку нам нужно было сделать пару манипуляций, но reshape()
и reshape
и reshape2
могут быть полезны, если у вас есть более сложный набор данных, который можно манипулировать.
После того, как данные находятся в этой сложной форме, для этого требуется только простой вызов ggplot()
для создания сюжета, который вы хотите, со всеми дополнительными функциями (одна из причин, почему такие высокоуровневые пакеты построения, как lattice
и ggplot2
, настолько полезны):
require(ggplot2)
p <- ggplot(stacked, aes(Dates, value, colour = variable))
p + geom_line()
Я оставлю это вам, чтобы привести в порядок метки оси, название легенды и т. д.
HTH
rep()
, поэтому мы действительно получаем только 3 cols в stacked
. Я отредактирую код, чтобы сделать отступ четким.
– Gavin Simpson
23 September 2010 в 17:28
melt()
хорошо принят, и я отмечаю, что пакет reshape [2] был бы полезен здесь. Я не так хорошо знаком с reshape2, и для такого простого манипулирования это делается вручную сложнее, чем вызов melt()
, это было меньше усилий, так как мне не нужно было читать, как использовать melt()
. И rcs пробрался с его ответом, пока я производил мой; когда я начал отвечать, ответов не было. более чем один способ кожи кошки - как говорится! ;-)
– Gavin Simpson
23 September 2010 в 17:33
Общий подход заключается в преобразовании данных в длинный формат (с использованием melt()
из пакета reshape
или reshape2
) или gather()
из пакета tidyr
:
library("reshape2")
library("ggplot2")
test_data_long <- melt(test_data, id="date") # convert to long format
ggplot(data=test_data_long,
aes(x=date, y=value, colour=variable)) +
geom_line()
[/g0]
gather()
пакета tidyr
для расплавления данных: gather(test_data, variable, value, -date)
– janosdivenyi
9 December 2015 в 11:13
colour=
в качестве имени переменной. – Darwin PC 27 October 2015 в 15:23+scale_colour_manual(values=c("black", "orange"))
– Dave X 18 September 2017 в 18:16