Показать сообщение отдельно
Старый 30.12.2015, 13:53   #67
Hogfather
Platinum Member
 
Аватар для Hogfather
 
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,281
По умолчанию

"Давненько не держал в руках я шашек".

Ну, что за Новый год, да без ёлочки.

Опять же, что интересно людям. Людям интересен козёл и тигр курс доллара, да цена на нефть.

Итак, в сегодняшнем коде показываем.
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.
---------
DNF is not an option
Hogfather вне форума   Ответить с цитированием
Реклама