2010-02-02 36 views
27

Có cách nào để sử dụng một hình ảnh nhỏ cụ thể làm điểm trong một phân tán với ggplot2 không. Lý tưởng nhất là tôi sẽ muốn thay đổi kích thước hình ảnh dựa trên một biến.Cách sử dụng hình ảnh làm điểm trong ggplot?

Dưới đây là một ví dụ:

library(ggplot2) 
p <- ggplot(mtcars, aes(wt, mpg)) 
p + geom_point(aes(size = qsec, shape = factor(cyl))) 

Vì vậy, tôi về cơ bản muốn biết nếu có một cách để cung cấp một hình ảnh cụ thể như hình dạng?

Trả lời

5

Thứ nhất, đây là câu trả lời của bạn:

Để cho bạn thấy làm thế nào để sử dụng như thế nào bạn có thể sử dụng tốt hơn các vật dụng để đại diện cho sự khác biệt dữ liệu, tôi giới thiệu bạn đến các ví dụ về chernoff faces tại phòng trưng bày R graph .:

alt text http://addictedtor.free.fr/graphiques/graphiques/graph_87.png

Tất cả mã để tạo ví dụ này có sẵn tại trang web.

Tương tự nhìn ggplot của stat_spoke cho một widget đơn giản: alt text http://had.co.nz/ggplot2/graphics/706b1badf6469940342f204b7bc98857.png

grImport cung cấp một cơ chế để nhập hình ảnh PDF đơn giản vào cốt truyện của bạn để sử dụng như điểm.

Bây giờ, sau một phê bình về ví dụ của bạn.


Đây không phải là phân tán. Về cơ bản, đây là danh sách các điểm dữ liệu được sắp xếp nơi màu được sử dụng để chỉ một biến văn bản và tiện ích không được định dạng và dự phòng đã được sử dụng để định khung dữ liệu nhưng không cung cấp phản hồi trực quan về kích thước hoặc hình dạng.

Nó không phải là một đồ thị tốt, bởi vì nó hoàn toàn không trả lời câu hỏi đã nêu "Có trả thêm chì để kết quả tốt hơn", và để người đọc đấu tranh rút ra kết luận đó (và rằng đồ thị khác, nếu cần) .

Ngoài ra, các tác giả đã lãng phí các trục x, y - có thể được sử dụng tốt để định vị các phần tử bằng cách gửi đi và kết quả, để cung cấp một sự hiểu biết trực quan về giá trị-tiền. Thay vào đó, họ đã chọn đặt hàng các biểu tượng theo tỷ lệ chi phí đầu người cho tỷ lệ tốt nghiệp trung bình, nhưng không trả lời câu hỏi đã nêu và không cho phép so sánh trực quan tỷ lệ tương đối giữa các trường đại học hoặc mối quan hệ giữa chi phí và giá trị.

Như tôi đã nói, theo ý kiến ​​của tôi, đây là biểu đồ không tốt và người đọc của bạn sẽ không được phục vụ tốt khi bạn sao chép nó.

+0

Cảm ơn bạn đã trả lời! Tôi đã xóa liên kết đó vì tôi nghĩ rằng bạn đã đúng. Nói chung, trừ khi tôi đang thiếu một cái gì đó, nó không có vẻ giống như hàm faces(), và stat_spoke thực sự giải quyết nhu cầu của tôi. faces() chỉ hiển thị khuôn mặt ... bạn không thể thay đổi hình ảnh. Và stat_spoke không cho phép bạn thay đổi hình ảnh. Nhưng grImport trông rất hứa hẹn! Cảm ơn! – griffin

+3

Các liên kết hình ảnh của bạn bị hỏng ... Tôi chọc xung quanh một chút để sửa chúng nhưng không thành công. – joran

+3

Có vẻ như câu hỏi đã được chỉnh sửa ở mức độ mà câu trả lời không còn ý nghĩa; cũng như có liên kết bị hỏng với hình ảnh. –

16

Dưới đây là một Geom tối giản để hiển thị hình ảnh raster thay vì điểm,

library(ggplot2) 
library(grid) 

## replace by a named list with matrices to be displayed 
## by rasterGrob 
.flaglist <- list("ar" = matrix(c("blue", "white", "blue"), 1), 
        "fr" = matrix(c("blue", "white", "red"), 1)) 

flagGrob <- function(x, y, country, size=1, alpha=1){ 
    grob(x=x, y=y, country=country, size=size, cl = "flag") 
} 

drawDetails.flag <- function(x, recording=FALSE){ 

    for(ii in seq_along(x$country)){ 
    grid.raster(x$x[ii], x$y[ii], 
       width = x$size[ii]*unit(1,"mm"), height = x$size[ii]*unit(0.5,"mm"), 
       image = .flaglist[[x$country[[ii]]]], interpolate=FALSE) 
    } 
} 


scale_country <- function(..., guide = "legend") { 
    sc <- discrete_scale("country", "identity", scales::identity_pal(), ..., guide = guide) 

    sc$super <- ScaleDiscreteIdentity 
    class(sc) <- class(ScaleDiscreteIdentity) 
    sc 
} 

GeomFlag <- ggproto("GeomFlag", Geom, 
        required_aes = c("x", "y", "country"), 
        default_aes = aes(size = 5, country="fr"), 

        draw_key = function (data, params, size) 
        { 
         flagGrob(0.5,0.5, country=data$country, size=data$size) 
        }, 

        draw_group = function(data, panel_scales, coord) { 
         coords <- coord$transform(data, panel_scales)  
         flagGrob(coords$x, coords$y, coords$country, coords$size) 
        } 
) 

geom_flag <- function(mapping = NULL, data = NULL, stat = "identity", 
         position = "identity", na.rm = FALSE, show.legend = NA, 
         inherit.aes = TRUE, ...) { 
    layer(
    geom = GeomFlag, mapping = mapping, data = data, stat = stat, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
    params = list(na.rm = na.rm, ...) 
) 
} 


set.seed(1234) 
d <- data.frame(x=rnorm(10), y=rnorm(10), 
       country=sample(c("ar","fr"), 10, TRUE), 
       stringsAsFactors = FALSE) 


ggplot(d, aes(x=x, y=y, country=country, size=x)) + 
    geom_flag() + 
    scale_country() 

enter image description here

(đầu ra từ gói ggflags)

2

Có một thư viện gọi ggimage để làm điều đó.Xem một intro vignette here

Bạn chỉ cần thêm một cột để data.frame của bạn với địa chỉ của những hình ảnh, có thể được lưu trữ trên web hoặc cục bộ trên máy tính của bạn và sau đó bạn có thể sử dụng geom_image():

library("ggplot2") 
library("ggimage") 

# create a df 

set.seed(2017-02-21) 
d <- data.frame(x = rnorm(10), 
       y = rnorm(10), 
       image = sample(c("https://www.r-project.org/logo/Rlogo.png", 
           "https://jeroenooms.github.io/images/frink.png"), 
           size=10, replace = TRUE) 
       ) 
# plot2 
    ggplot(d, aes(x, y)) + geom_image(aes(image=image), size=.05) 

enter image description here

ps. Lưu ý rằng ggimage tùy thuộc vào EBImage. Vì vậy, để cài đặt gginamge Tôi phải làm điều này:

# install EBImage 
    source("https://bioconductor.org/biocLite.R") 
    biocLite("EBImage") 
# install ggimage 
    install.packages("ggimage") 
Các vấn đề liên quan