R, ggplot2, тепловая карта - PullRequest
       10

R, ggplot2, тепловая карта

2 голосов
/ 11 декабря 2011

Я пытаюсь выяснить, возможно ли вообще создать тепловую карту производительности запаса - что-то похожее на следующее, где наибольшее значение отображается в одном углу, а наименьшее - в другом.

http://shares.telegraph.co.uk/heatmaps/f_heatmap.php

Мои данные - это объект xts, который выглядит следующим образом:

> AdjPrices50AvgPercent
           SPY.Adjusted IWM.Adjusted DIA.Adjusted XLI.Adjusted XLB.Adjusted
2011-12-09         3.12         4.61         4.39         4.49         2.32
           XLF.Adjusted XLE.Adjusted XOP.Adjusted OIH.Adjusted XLY.Adjusted
2011-12-09         2.84          3.8         5.45         0.45          3.1
           XLP.Adjusted XLV.Adjusted XLU.Adjusted SMH.Adjusted QQQ.Adjusted
2011-12-09         3.41         2.63         1.86         1.99          1.2
           XHB.Adjusted PPH.Adjusted XME.Adjusted GDX.Adjusted GLD.Adjusted
2011-12-09         9.46         4.41         3.73        -0.02         0.15
           SLV.Adjusted USO.Adjusted MOO.Adjusted KRE.Adjusted KBE.Adjusted
2011-12-09        -1.24         7.46         0.11         5.78         2.84
           XRT.Adjusted VNQ.Adjusted JNK.Adjusted HYG.Adjusted LQD.Adjusted
2011-12-09         4.32         3.12         2.08         2.35        -0.35
           TLT.Adjusted TIP.Adjusted IEF.Adjusted VXX.Adjusted
2011-12-09        -0.27         0.25         0.45        -9.27

Я читал книгу R ggplot2, но не выяснил, как создать такую ​​карту.Я возился с различными сюжетами, но ничего похожего на то, чего я хочу достичь.Я очень ценю помощь.

1 Ответ

6 голосов
/ 13 декабря 2011

Данные, которые вы дали, трудно прочитать. Вот гораздо более простая версия:

AdjPrices50AvgPercent <-
structure(list(SPY.Adjusted = 3.12, IWM.Adjusted = 4.61, DIA.Adjusted = 4.39, 
    XLI.Adjusted = 4.49, XLB.Adjusted = 2.32, XLF.Adjusted = 2.84, 
    XLE.Adjusted = 3.8, XOP.Adjusted = 5.45, OIH.Adjusted = 0.45, 
    XLY.Adjusted = 3.1, XLP.Adjusted = 3.41, XLV.Adjusted = 2.63, 
    XLU.Adjusted = 1.86, SMH.Adjusted = 1.99, QQQ.Adjusted = 1.2, 
    XHB.Adjusted = 9.46, PPH.Adjusted = 4.41, XME.Adjusted = 3.73, 
    GDX.Adjusted = -0.02, GLD.Adjusted = 0.15, SLV.Adjusted = -1.24, 
    USO.Adjusted = 7.46, MOO.Adjusted = 0.11, KRE.Adjusted = 5.78, 
    KBE.Adjusted = 2.84, XRT.Adjusted = 4.32, VNQ.Adjusted = 3.12, 
    JNK.Adjusted = 2.08, HYG.Adjusted = 2.35, LQD.Adjusted = -0.35, 
    TLT.Adjusted = -0.27, TIP.Adjusted = 0.25, IEF.Adjusted = 0.45, 
    VXX.Adjusted = -9.27), .Names = c("SPY.Adjusted", "IWM.Adjusted", 
"DIA.Adjusted", "XLI.Adjusted", "XLB.Adjusted", "XLF.Adjusted", 
"XLE.Adjusted", "XOP.Adjusted", "OIH.Adjusted", "XLY.Adjusted", 
"XLP.Adjusted", "XLV.Adjusted", "XLU.Adjusted", "SMH.Adjusted", 
"QQQ.Adjusted", "XHB.Adjusted", "PPH.Adjusted", "XME.Adjusted", 
"GDX.Adjusted", "GLD.Adjusted", "SLV.Adjusted", "USO.Adjusted", 
"MOO.Adjusted", "KRE.Adjusted", "KBE.Adjusted", "XRT.Adjusted", 
"VNQ.Adjusted", "JNK.Adjusted", "HYG.Adjusted", "LQD.Adjusted", 
"TLT.Adjusted", "TIP.Adjusted", "IEF.Adjusted", "VXX.Adjusted"
), class = "data.frame", row.names = "2011-12-09")

Учитывая это, это лучшее, что я могу придумать.Обратите внимание, что, как сказал Алекс, это не тепловая карта.Это потому, что горизонтальное и вертикальное положение квадратов не связано с какими-либо конкретными измерениями.

Сначала я изменяю форму данных, чтобы им было легче работать;ggplot2 любит данные в длинном, а не в широком формате.

library("reshape2")
ap <- melt(data=AdjPrices50AvgPercent)
ap <- ap[rev(order(ap$value)),]
ap$variable <- factor(ap$variable, levels=ap$variable)

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

ggplot(ap) +
    geom_rect(aes(xmin=0, xmax=1, ymin=0, ymax=1, fill=value)) +
    geom_text(aes(label=variable), x=0.5, y=0.6, size=3) +
    geom_text(aes(label=paste(value,"%",sep="")), x=0.5, y=0.4, size=3) +
    scale_x_continuous(expand=c(0,0)) +
    scale_y_continuous(expand=c(0,0)) +
    scale_fill_gradient2(low="blue", mid="green", high="red", 
                         limits=c(-1,1)*max(abs(ap$value)), breaks=(-9):9) +
    coord_equal() +
    facet_wrap(~variable) +
    opts(axis.text.x = theme_blank(),
         axis.text.y = theme_blank(),
         axis.title.x = theme_blank(),
         axis.title.y = theme_blank(),
         axis.ticks = theme_blank(),
         axis.ticks.margin = unit(0, "mm"),
         strip.background = theme_blank(),
         strip.text.x = theme_blank(),
         panel.margin = unit(0, "mm"),
         panel.background = theme_blank())

Это дает:

...