49

ggplot2 を使用して特定の小さな画像を散布図の点として使用する方法はありますか。理想的には、変数に基づいて画像のサイズを変更したいと思うでしょう。

次に例を示します。

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

基本的に、特定の画像を形状として提供する方法があるかどうかを知りたいですか?

4

3 に答える 3

30

ポイントの代わりにラスター画像を表示するための最小限のジオメトリを次に示します。

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()

ここに画像の説明を入力

(ggflags パッケージからの出力)

于 2016-03-23T07:45:58.360 に答える
4

まず、あなたの答えは次のとおりです。

ウィジェットを使用してデータの差別化をより適切に表現する方法を示すために、R グラフ ギャラリーのチャーノフ面の例を参照してください。

代替テキスト
(出典: free.fr )

この例を生成するためのすべてのコードは、サイトで入手できます。

または、ggplot のstat_spokeで単純なウィジェットを探します: (ソース: had.co.nz )代替テキスト

grImportは、単純な PDF 画像をプロットにインポートして点として使用するメカニズムを提供します。

次に、あなたの例への批判に従います。


これは散布図ではありません。これは基本的に、テキスト変数の 1 つを示すために色が使用されている順序付けられたデータ ポイントのフロー リストであり、データをフレーム化するために有益で冗長なウィジェットが使用されていますが、それ以外の場合、サイズや形状に関して視覚的なフィードバックは提供されません。

これは良いグラフではありません。なぜなら、「より多く支払うことでより良い結果が得られるか」という前述の質問に完全に答えることができず、読者は自分でその結論 (および必要に応じて他のグラフ) を引き出すのに苦労することになるからです。

さらに、作成者は x 軸、y 軸を無駄にしています。これは、出費と結果によって要素を配置するために使用できたはずであり、対価の価値を視覚的に理解できるようにするためのものです。代わりに、1 人あたりの費用と平均卒業率の比率でアイコンを並べることを選択しました。これは便利ですが、前述の質問には答えず、大学間の相対比率を直接視覚的に比較することはできません。コストと価値の関係。

私が言うように、私の意見では、これは悪いグラフであり、あなたの読者はあなたがそれを複製してもあまり役に立たないでしょう.

于 2010-02-02T08:49:24.637 に答える