क्या इस चार्ट का कोई नाम है - पाई चार्ट और मेको प्लॉट के बीच एक क्रॉस की तरह


9

क्या नीचे दिए गए इस तरह के चार्ट के लिए एक नाम है (न्यूजीलैंड के व्यापार, नवाचार और रोजगार मंत्रालय से जिनके लिए मैं काम करता हूं, लेकिन मैं इस साजिश को बनाने में शामिल नहीं था)? इसमें आयताकार होते हैं जहाँ क्षेत्र एक चर के समानुपाती होता है, और पाई चार्ट, मोज़ेक प्लॉट और मीको प्लॉट के बीच एक प्रकार का क्रॉस जैसा दिखता है। यह शायद मीको प्लॉट के सबसे करीब है, लेकिन यह जटिलता है कि हम स्तंभों के साथ काम नहीं कर रहे हैं बल्कि एक अधिक जटिल आरा हैं।

मूल थोड़ा बेहतर दिखता है क्योंकि प्रत्येक क्षेत्र के लिए आयतों के बीच सफेद सीमाएं हैं।

हैरानी की बात है, यह वास्तव में मुझे एक सांख्यिकीय ग्राफिक के रूप में बहुत बुरा नहीं है, हालांकि यह कुछ सार्थक करने के लिए रंग मैप के बेहतर उपयोग के माध्यम से सुधार किया जा सकता है। यूएस 2011 के बजट को दिखाने वाला एक शक्तिशाली इंटरैक्टिव संस्करण न्यूयॉर्क टाइम्स द्वारा उपयोग किया गया है ।

एक दिलचस्प चुनौती यह है कि किसी को आकर्षित करने के लिए एक स्वचालित एल्गोरिदम के बारे में सोचा जाए और इसे उचित भी बनाया जाए। आयतों को स्वीकार्य सीमा के भीतर अलग-अलग पहलू अनुपात की अनुमति देने की आवश्यकता होती है।

यहाँ छवि विवरण दर्ज करें


इस सवाल के साथ शुरू हुई परियोजना का अंतिम परिणाम यहां से जुड़े इंटरेक्टिव वेब टूल में देखा जा सकता है: mbie.govt.nz/what-we-do/business-growth-agenda/regions
पीटर

जवाबों:


11

यह एक ट्रेमेप है, मुझे लगता है ( http://en.wikipedia.org/wiki/Treemapping )।

आर में कई पैकेज हैं, उदाहरण के लिए, जो treemaps बनाते हैं। पैकेजों में से एक को treemap कहा जाता है, और दूसरा एक पोर्टफोलियो है। उदाहरण के लिए, नाथन याउ आर ( http://flowingdata.com/2010/02/11/an-easy-way-to-make-a-treemap/ ) का उपयोग करके एक ट्रीमैप बनाने के लिए एक ट्यूटोरियल प्रदान करता है ।


12

सवाल नाम है, लेकिन यह कितनी अच्छी तरह से काम करता है चर्चा के लिए भी खुला है।

यहां एक वैकल्पिक, एक क्षैतिज बार चार्ट के रूप में कुछ अधिक समृद्ध है।

यहाँ छवि विवरण दर्ज करें

हम इस तरह के ग्राफ के साथ क्या करना चाहते हैं, समग्र पैटर्न के कुछ समझ से अलग-अलग मामलों की जांच के लिए अलग-अलग हो सकते हैं (हॉक की खाड़ी के बारे में, और इसके बाद)। मैं दावा करता हूं कि दोनों एक बार चार्ट के साथ आसान हैं। छोटे विवरण हैं कि मैं शीर्षकों और नामों में निचले मामले का उपयोग करता हूं जहां आसान और% चिन्ह को दोहराते नहीं हैं। मैंने रंग कोडिंग की लगभग नकल कर ली है, इसका अर्थ यह नहीं है कि यह स्पष्ट है, या अस्पष्ट है, जैसा कि मैंने नकल किया है।

मेरा सुझाव है कि treemaps की कुछ अपील उनके सापेक्ष नवीनता में निहित है। वे दर्जनों नामों के साथ-साथ या बार चार्ट की तुलना में बेहतर काम कर सकते हैं, जो एक लंबे कॉलम में सूचीबद्ध होने के बजाय दो-आयामी क्षेत्र में फैल सकते हैं। लेकिन 15 या इतने नामों के लिए, एक बार चार्ट मेरे विचार में एक मजबूत प्रतियोगी बना हुआ है।

मैं यहां (क्लीवलैंड) डॉट चार्ट को पसंद करने वाले किसी भी व्यक्ति के साथ खुश हूं। एक ऊर्ध्वाधर बार चार्ट में क्षेत्र के नामों को आराम से रखने की कठिनाई का सामना करना पड़ेगा। (बस यह देखने के लिए कि इस ग्राफ को घुमाने की कल्पना करें।) मुझे नंबर देने का विचार भी पसंद है, हालांकि परंपरावादियों को ग्राफ और टेबल के विचारों का मिश्रण पसंद नहीं है।

स्टैटा में ग्राफ खींचा गया था।


4
मुझे इसे खोदना होगा, लेकिन अगर मेरी स्मृति मुझे सही ढंग से कार्य करती है तो पेड़ के नक्शे के मूल उद्देश्यों में से एक जानकारी के एक पदानुक्रमित संगठन के लिए था (यानी आपको पदानुक्रम के विभिन्न स्तरों के संयुक्त आकार को देखने की अनुमति देने के लिए) कई और नंबरों के लिए। आशय संख्याओं की छोटी सूची के लिए कभी नहीं था और एक अधिक खोजपूर्ण अपील की थी, आयताकार Treemaps ( Kong et al। 2010 ) बनाने के लिए अवधारणात्मक दिशानिर्देश देखें
Andy W

1
यही मेरा आभास भी है, इसलिए नाम का नाम भी है। यहाँ एक पदानुक्रम का केवल एक स्तर स्पष्ट है।
निक कॉक्स

4
Bill Shneiderman ने कुछ प्रासंगिक प्रकाशनों ( cs.umd.edu/hcil/treemap-history ) के लिंक के साथ treemaps का एक अच्छा इतिहास रखा है । शुरू में डेन्ड्रोग्राम्स या पेड़ों की तुलना में ट्रेमैप्स का उद्देश्य बहुस्तरीय पदानुक्रम को कम अव्यवस्थित तरीके से प्रदर्शित करना था, और वे पहले हार्ड डिस्क की सामग्री को देखने के लिए उपयोग किए जाते थे। आजकल, ट्रेमैप्स का उपयोग बड़े फ़ेग्लोजेनेटिक्स पेड़ों की कल्पना के लिए किया जाता है (वे प्रजातियों के बीच संबंधों को दिखाते हैं), अन्य अनुप्रयोगों के बीच। अधिक उदाहरणों के लिए, Shneiderman द्वारा लेख को perceptualedge.com/articles/b-eye/treemaps.pdf पर देखें
जेटीटी

धन्यवाद; इसके लायक मैं इस विशेष मामले में सहमत हूं।
पीटर एलिस

3

संपादित / जोड़

जब से मैंने पाया है कि treemap पैकेज नीचे दिए गए map.market () फ़ंक्शन (और अनुकूलित) फ़ंक्शन की तुलना में बहुत बेहतर परिणाम देता है; लेकिन मैं ऐतिहासिक कारणों से अपना जवाब छोड़ दूंगा।

मूल उत्तर

जवाब के लिए धन्यवाद। @JTT द्वारा उपलब्ध कराए गए प्रवाह डेटा लिंक पर निर्माण करना लेकिन एक उचित ग्राफिक प्राप्त करने के लिए इलस्ट्रेटर या इंकस्केप में हाथ से मोड़ने की आवश्यकता को नापसंद करते हुए, मैंने इसे बनाने के लिए जेफ एनोस और डेविड केन के पोर्टफोलियो पैकेज में map.market () फ़ंक्शन को ट्विक किया। उपयोगकर्ता द्वारा नियंत्रित, लेबल आयत के आकार से भिन्न होते हैं, और लाल-हरे रंग के विरोधाभासों से बचते हैं। उदाहरण उपयोग:

library(portfolio)
library(extrafont)
data(dow.jan.2005)

with(dow.jan.2005, 
    treemap(id    = symbol,
        area  = price,
        group = sector,
        color = 100 * month.ret,
        labsc = .12,  # user-chosen scaling of labels 
        fontfamily="Comic Sans MS")
    )

यहाँ छवि विवरण दर्ज करें

इसके लायक क्या है, मैं @NickCox से भी सहमत हूं कि मेरे मूल प्रश्न में उदाहरण में एक डॉट प्लॉट श्रेष्ठ है। मेरे अनुकूलित treemap () फ़ंक्शन का कोड निम्नानुसार है।

treemap <- function (id, area, group, color, scale = NULL, lab = c(group = TRUE, 
    id = FALSE), low="red", middle="grey60", high="blue", main = "Map of the Market", labsc = c(.5, 1), print = TRUE, ...) 
{
    # Adapted by Peter Ellis from map.market() by Jeff Enos and David Kane in the portfolio package on CRAN
    # See map.market for the original helpfile.  The changes are:
    # 1. low, middle and high are user-set color ramp choices
    # 2. The font size now varies with the area of the rectangle being labelled; labsc is a scaling parameter to make it look ok.
    #    First element of labsc is scaling parameter for size of group labels.  Second element is scaling for id labels.
    # 3. ... extra arguments to be passed to gpar() when drawing labels; expected use is for fontfamily="whatever"
    require(portfolio)
    if (any(length(id) != length(area), length(id) != length(group), 
        length(id) != length(color))) {
        stop("id, area, group, and color must be the same length.")
    }
    if (length(lab) == 1) {
        lab[2] <- lab[1]
    }
    if (missing(id)) {
        id <- seq_along(area)
        lab["id"] <- FALSE
    }
    stopifnot(all(!is.na(id)))
    data <- data.frame(label = id, group, area, color)
    data <- data[order(data$area, decreasing = TRUE), ]
    na.idx <- which(is.na(data$area) | is.na(data$group) | is.na(data$color))
    if (length(na.idx)) {
        warning("Stocks with NAs for area, group, or color will not be shown")
        data <- data[-na.idx, ]
    }
    zero.area.idx <- which(data$area == 0)
    if (length(zero.area.idx)) {
        data <- data[-zero.area.idx, ]
    }
    if (nrow(data) == 0) {
        stop("No records to display")
    }
    data$color.orig <- data$color
    if (is.null(scale)) {
        data$color <- data$color * 1/max(abs(data$color))
    }
    else {
        data$color <- sapply(data$color, function(x) {
            if (x/scale > 1) 
                1
            else if (-1 > x/scale) 
                -1
            else x/scale
        })
    }
    data.by.group <- split(data, data$group, drop = TRUE)
    group.data <- lapply(data.by.group, function(x) {
        sum(x[, 3])
    })
    group.data <- data.frame(area = as.numeric(group.data), label = names(group.data))
    group.data <- group.data[order(group.data$area, decreasing = TRUE), 
        ]
    group.data$color <- rep(NULL, nrow(group.data))
    color.ramp.pos <- colorRamp(c(middle, high))
    color.ramp.neg <- colorRamp(c(middle, low))
    color.ramp.rgb <- function(x) {
        col.mat <- mapply(function(x) {
            if (x < 0) {
                color.ramp.neg(abs(x))
            }
            else {
                color.ramp.pos(abs(x))
            }
        }, x)
        mapply(rgb, col.mat[1, ], col.mat[2, ], col.mat[3, ], 
            max = 255)
    }
    add.viewport <- function(z, label, color, x.0, y.0, x.1, 
        y.1) {
        for (i in 1:length(label)) {
            if (is.null(color[i])) {
                filler <- gpar(col = "blue", fill = "transparent", 
                  cex = 1)
            }
            else {
                filler.col <- color.ramp.rgb(color[i])
                filler <- gpar(col = filler.col, fill = filler.col, 
                  cex = 0.6)
            }
            new.viewport <- viewport(x = x.0[i], y = y.0[i], 
                width = (x.1[i] - x.0[i]), height = (y.1[i] - 
                  y.0[i]), default.units = "npc", just = c("left", 
                  "bottom"), name = as.character(label[i]), clip = "on", 
                gp = filler)
            z <- append(z, list(new.viewport))
        }
        z
    }
    squarified.treemap <- function(z, x = 0, y = 0, w = 1, h = 1, 
        func = add.viewport, viewport.list) {
        cz <- cumsum(z$area)/sum(z$area)
        n <- which.min(abs(log(max(w/h, h/w) * sum(z$area) * 
            ((cz^2)/z$area))))
        more <- n < length(z$area)
        a <- c(0, cz[1:n])/cz[n]
        if (h > w) {
            viewport.list <- func(viewport.list, z$label[1:n], 
                z$color[1:n], x + w * a[1:(length(a) - 1)], rep(y, 
                  n), x + w * a[-1], rep(y + h * cz[n], n))
            if (more) {
                viewport.list <- Recall(z[-(1:n), ], x, y + h * 
                  cz[n], w, h * (1 - cz[n]), func, viewport.list)
            }
        }
        else {
            viewport.list <- func(viewport.list, z$label[1:n], 
                z$color[1:n], rep(x, n), y + h * a[1:(length(a) - 
                  1)], rep(x + w * cz[n], n), y + h * a[-1])
            if (more) {
                viewport.list <- Recall(z[-(1:n), ], x + w * 
                  cz[n], y, w * (1 - cz[n]), h, func, viewport.list)
            }
        }
        viewport.list
    }
    map.viewport <- viewport(x = 0.05, y = 0.05, width = 0.9, 
        height = 0.75, default.units = "npc", name = "MAP", just = c("left", 
            "bottom"))
    map.tree <- gTree(vp = map.viewport, name = "MAP", children = gList(rectGrob(gp = gpar(col = "dark grey"), 
        name = "background")))
    group.viewports <- squarified.treemap(z = group.data, viewport.list = list())
    for (i in 1:length(group.viewports)) {
        this.group <- data.by.group[[group.data$label[i]]]
        this.data <- data.frame(this.group$area, this.group$label, 
            this.group$color)
        names(this.data) <- c("area", "label", "color")
        stock.viewports <- squarified.treemap(z = this.data, 
            viewport.list = list())
        group.tree <- gTree(vp = group.viewports[[i]], name = group.data$label[i])
        for (s in 1:length(stock.viewports)) {
            stock.tree <- gTree(vp = stock.viewports[[s]], name = this.data$label[s], 
                children = gList(rectGrob(name = "color")))
            if (lab[2]) {
                stock.tree <- addGrob(stock.tree, textGrob(x = unit(1, 
                  "lines"), y = unit(1, "npc") - unit(1, "lines"), 
                  label = this.data$label[s], gp = gpar(col = "white", fontsize=this.data$area[s] * labsc[2], ...), 
                  name = "label", just = c("left", "top")))
            }
            group.tree <- addGrob(group.tree, stock.tree)
        }
        group.tree <- addGrob(group.tree, rectGrob(gp = gpar(col = "grey"), 
            name = "border"))
        if (lab[1]) {
            group.tree <- addGrob(group.tree, textGrob(label = group.data$label[i], 
                name = "label", gp = gpar(col = "white", fontsize=group.data$area[i] * labsc[1], ...)))
        }
        map.tree <- addGrob(map.tree, group.tree)
    }
    op <- options(digits = 1)
    top.viewport <- viewport(x = 0.05, y = 1, width = 0.9, height = 0.2, 
        default.units = "npc", name = "TOP", , just = c("left", 
            "top"))
    legend.ncols <- 51
    l.x <- (0:(legend.ncols - 1))/(legend.ncols)
    l.y <- unit(0.25, "npc")
    l.cols <- color.ramp.rgb(seq(-1, 1, by = 2/(legend.ncols - 
        1)))
    if (is.null(scale)) {
        l.end <- max(abs(data$color.orig))
    }
    else {
        l.end <- scale
    }
    top.list <- gList(textGrob(label = main, y = unit(0.7, "npc"), 
        just = c("center", "center"), gp = gpar(cex = 2, ...)), segmentsGrob(x0 = seq(0, 
        1, by = 0.25), y0 = unit(0.25, "npc"), x1 = seq(0, 1, 
        by = 0.25), y1 = unit(0.2, "npc")), rectGrob(x = l.x, 
        y = l.y, width = 1/legend.ncols, height = unit(1, "lines"), 
        just = c("left", "bottom"), gp = gpar(col = NA, fill = l.cols), 
        default.units = "npc"), textGrob(label = format(l.end * 
        seq(-1, 1, by = 0.5), trim = TRUE), x = seq(0, 1, by = 0.25), 
        y = 0.1, default.units = "npc", just = c("center", "center"), 
        gp = gpar(col = "black", cex = 0.8, fontface = "bold")))
    options(op)
    top.tree <- gTree(vp = top.viewport, name = "TOP", children = top.list)
    mapmarket <- gTree(name = "MAPMARKET", children = gList(rectGrob(gp = gpar(col = "dark grey", 
        fill = "dark grey"), name = "background"), top.tree, 
        map.tree))
    if (print) {
        grid.newpage()
        grid.draw(mapmarket)
    }
    invisible(mapmarket)
}

कोई संदेह नहीं है कि कोड उपयोगी होगा। मैं उन क्षेत्रों में चर्चा को नहीं खींचना चाहता, जहां यह नहीं जाएगा, लेकिन क्या उदाहरण काफी मनमाना है या क्या क्षेत्रों को स्टॉक की कीमतों का प्रतिनिधित्व करने के लिए तर्क है? इस भूखंड पर हमें क्या देखना या देखना चाहिए? (मैं शत्रुतापूर्ण नहीं हूं, सिर्फ असली के लिए इस डिजाइन का उपयोग करने की कोशिश करने के साथ पूरी तरह से अनुभवहीन हूं, हालांकि मैंने बहुत सारे उदाहरण देखे हैं।)
निक कॉक्स

1
वास्तव में मैंने सिर्फ उदाहरण लिया कि Enos और केन द्वारा map.market () के लिए सहायता फ़ाइल से। इस पर चिंतन करते हुए मैंने यह नहीं देखा कि उन्होंने क्षेत्र प्रदर्शन मूल्य क्यों चुना; एक अधिक समझदारी भरा उपाय निश्चित रूप से कुल पूंजीकरण यानी शेयरों की कीमत x संख्या (बाजार में शेयरों की संख्या, या सिर्फ मेरे द्वारा होने वाले शेयरों की संख्या को इस उद्देश्य के आधार पर दिखाने के लिए होगा) को दर्शाने के लिए होगा। तब आपके पास विभिन्न शेयरों के महत्व को दिखाने के लिए प्लॉट का अच्छा सहज उपयोग होगा।
पीटर एलिस

मैं भी कीमत के उपयोग से हैरान था।
निक कॉक्स

1

यह एक ट्रेमेप है, आप इसे आसानी से टैब्लेउ 8 और फ्री टैब्लो पब्लिक के साथ कर सकते हैं, यहां नमूना देखें: http://www.tableausoftware.com/new-features/new-view-types । आप @this URL भी देख सकते हैं कि ट्रेमेप को बार चार्ट के साथ जोड़ा जा सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.