Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,286
|
"Давненько не держал в руках я шашек".
Ну, что за Новый год, да без ёлочки.
Опять же, что интересно людям. Людям интересен козёл и тигр курс доллара, да цена на нефть.
Итак, в сегодняшнем коде показываем.
1. Как получить данные с Яндекс (недокументировано)
2. Как слить данные в одну таблицу
3. Как воспользоваться преимуществами новой версии ggplot и использовать возможность определить пользовательские символы для отображения графиков.
4. Как удовлетворить строгих редакторов журналов, устанавливающих размер шрифта и размер картинки.
Итак, строим график за 2015 год зависимости курса ЦБ от цены на нефть.
Код:
library(ggplot2)
require(XML)
# Загружаем цену нефти
download.file("https://news.yandex.ru/quotes/graph_1006.xml","graph_1006.xml")
data <- xmlParse("graph_1006.xml")
xml_data <- xmlToList(data)
graphData1<-data.frame(Dat=format(as.Date(as.numeric(unlist(strsplit(xml_data$x,";")))/3600/24, origin = "1970-01-01"),"%Y-%m-%d"),
Brent=as.numeric(unlist(strsplit(xml_data$y$text,";"))))
# Загружаем курс USD в рублях
download.file("https://news.yandex.ru/quotes/graph_1.xml","graph_1.xml")
data <- xmlParse("graph_1.xml")
xml_data <- xmlToList(data)
graphData2<-data.frame(Dat=format(as.Date(as.numeric(unlist(strsplit(xml_data$x,";")))/3600/24, origin = "1970-01-01"),"%Y-%m-%d"),
USD=as.numeric(unlist(strsplit(xml_data$y$text,";"))))
# Объединяем
graphData<-merge(graphData1,graphData2,by="Dat")
graphData$year=as.factor(format(as.Date(graphData$Dat),"%Y"))
graphData$month=as.factor(format(as.Date(graphData$Dat),"%m"))
graphData$wd=as.factor(format(as.Date(graphData$Dat),"%u"))
# "В лесу родилась ёлочка..."
# См. http://www.r-bloggers.com/geom_christmas_tree-a-new-geom-for-ggplot2-v2-0/
# Нижеследующий код нужен для построения елочек
GeomChristmasTree <- ggproto("GeomChristmasTree", Geom,
required_aes = c("x", "y"),
default_aes = aes(shape = 19, colour = "black",
fill = "green4", size = 3,
linetype = 1, alpha = 1,
fontsize = 1),
draw_key = draw_key_polygon,
draw_panel = function(data, panel_scales, coord) {
coords <- coord$transform(data, panel_scales)
# each tree has 4*branches + 3 points
if (length(coords$size) == 1) {
tsize <- rep(pmax(1, round(coords$size)), length(coords$x))
theight <- rep(pmax(0, round(coords$size)), length(coords$x))
} else {
tsize <- pmax(1, round(coords$size))
theight <- pmax(0, coords$size)
}
# scale factors
r01x <- diff(range(coords$x))/100
r01y <- diff(range(coords$y))/100
# coords
longx <- unlist(lapply(seq_along(coords$x), function(i) {
if (tsize[i] == 1) {
dx <- -c(0.3, 0.3, 1.2, 0, -1.2, -0.3, -0.3)
} else {
dx <- -c(0.3, 0.3, rep(c(1.2,0.3), tsize[i]-1), 1.2, 0, -1.2, rep(c(-0.3,-1.2), tsize[i]-1), -0.3, -0.3)
}
r01x*dx + coords$x[i]
}))
longy <- unlist(lapply(seq_along(coords$y), function(i) {
if (tsize[i] == 1) {
dy <- c(-0.5, 0, 0, theight[i], 0, 0, -0.5)
} else {
dy <- c(-0.5, 0, 0, rep(1:(tsize[i]-1), each=2), theight[i], rep((tsize[i]-1):1, each=2), 0, 0, -0.5)
}
r01y*dy + coords$y[i]
}))
longid <- unlist(sapply(seq_along(coords$y), function(i) {
rep(i, each=4*tsize[i]+3)
}))
grid::polygonGrob(
longx,
longy,
id = longid,
gp = grid::gpar(col = coords[,"colour"],
fill = coords[,"fill"],
fontsize = 10)
)
}
)
geom_christmas_tree <- function(mapping = NULL, data = NULL, stat = "identity",
position = "identity", na.rm = FALSE, show.legend = NA,
inherit.aes = TRUE, ...) {
layer(
geom = GeomChristmasTree, mapping = mapping, data = data, stat = stat,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(na.rm = na.rm, ...)
)
}
# "В лесу она росла..."
# Строим график зависимости курса от цены на нефть
ggplot(subset(graphData,year=="2015"), aes(x=Brent, y=USD)) +
stat_smooth()+
geom_christmas_tree(aes(fill=month,size=wd)) +
labs(x="Цена на Нефть Brent (ICE.Brent), USD/баррель",y="Курс USD ЦБ РФ, руб.")+
scale_fill_discrete(name = "Месяц")+
scale_size_discrete(guide=FALSE)+
theme_bw()+theme(text=element_text(size=14))
# Сохраняем картинку. Размер в дюймах.
ggsave("Pic1.png",width=6,height=6,dpi=300)
Результат
Цвет ёлочки определяется месяцем, а размер -- днем недели. Обижать художника прошу вот здесь.
Модификация графика
Код:
ggplot(subset(graphData,year=="2015"), aes(x=Brent, y=USD)) +
stat_density_2d(aes(color=month))+
geom_christmas_tree(aes(fill=month,size=wd)) +
labs(x="Цена на Нефть Brent (ICE.Brent), USD/баррель",y="Курс USD ЦБ РФ, руб.")+
scale_fill_discrete(name = "Месяц")+
scale_size_discrete(guide=FALSE)+
scale_color_discrete(guide=FALSE)+
theme_bw()+theme(text=element_text(size=14))
ggsave("Pic1.png",width=6,height=6,dpi=300)
Последний раз редактировалось Hogfather; 30.12.2015 в 14:55.
|