سؤال

آسف لعدم تضمين أي بيانات مثال لمشكلتي. لم أتمكن من العثور على طريقة لإنتاج ملف شكل مثال بسهولة. نأمل ، مستخدمين ذوي خبرة ggplot يمكن أن أرى ما أود القيام به من الوصف أدناه.

لدي:

  • أ data.frame x مع معلومات حول عينة المخططات (plotid, var1, var2, var3, var4, …)

  • Polygon Formefile Y مع المعلومات المكانية لمخططات العينة

استيراد FASEFILE Y (مع maptools) و fortifyجي كما data.frame Z (ggplot2) يعمل بشكل جيد. meltعمل X ل X_melted يعمل على ما يرام. merge-عمل Z و X_melted ل mapdf يعمل كذلك.

هذا يعني أنه لدينا الآن data.frame في شكل طويل مع المعلومات المكانية و var1, var2, var3, …

الآن أريد أن أرسم إطار البيانات هذا مثل هذا:

pl1 <- ggplot(mapdf,aes(long,lat),group=group)
pl1 <- pl1 + geom_polygon(aes(group=group,fill=value),colour="black")
pl1 <- pl1 + facet_grid(variable ~ .)
pl1 <- pl1 + coord_equal(ratio = 1)
pl1

والنتيجة هي مؤامرة جميلة مع لوحة واحدة لكل متغير. خرائط الألواح متطابقة ، لكن لون التعبئة يختلف مع قيم المتغيرات. حتى الآن ، كل شيء يعمل مثل السحر ... مع مشكلة واحدة:

المتغيرات لها قيم دقيقة وماكس مختلفة. علي سبيل المثال var1 يذهب من 0 ل 5, var2 من عند 0 ل 400, var3 من عند 5 ل 10, ، إلخ. في هذا المثال ، ينتقل أسطورة لون التعبئة 0 ل 400. var2 تم رسمه بشكل جيد ، لكن var1 و var3 هي أساسا في نفس اللون.

هل هناك طريقة يمكنني استخدام أسطورة مختلفة لكل لوحة من الوجه؟ أم أن هذا ببساطة غير ممكن (بعد) مع facet_wrap أو facet_grid في ggplot?

يمكن أن أقوم بعمل قطع فردية لكل متغير والانضمام إليهم مع منصات العرض ، ولكن هناك الكثير من المتغيرات وسيكون هذا الكثير من العمل.

أم أن هناك حزمة أو طريقة أخرى يمكنني استخدامها لإنجاز ما أود القيام به؟

وسوف تكون المساعدة موضع تقدير كبير. قون

تحرير: بمساعدة ggplot2-وصف التعبئة ، قمت ببناء مثال يوضح مشكلتي:

ids <- factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3"))
values <- data.frame(
id = ids,
val1 = cumsum(runif(6, max = 0.5)),
val2 = cumsum(runif(6, max = 50))
)
positions <- data.frame(
id = rep(ids, each = 4),
x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)
)

values <- melt(values)
datapoly <- merge(values, positions, by=c("id"))

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

توضح اللوحة الموجودة على اليمين قيمًا مختلفة لـ var2 على الخريطة. ومع ذلك ، على اللوحة على اليسار ، جميع المضلعات لها نفس اللون. هذا منطقي ، لأنه يتم استخدام تدرج لون واحد فقط لجميع اللوحات. هل يمكنني استخدام تدرج لون مختلف لكل لوحة؟

هل كانت مفيدة؟

المحلول

حاليًا يمكن أن يكون هناك مقياس واحد فقط لكل قطعة (لكل شيء باستثناء x و y).

نصائح أخرى

مع الخير الشبكة

align.plots <- function(..., vertical=TRUE){
#http://ggextra.googlecode.com/svn/trunk/R/align.r
  dots <- list(...)
  dots <- lapply(dots, ggplotGrob)
  ytitles <- lapply(dots, function(.g) editGrob(getGrob(.g,"axis.title.y.text",grep=TRUE), vp=NULL))
  ylabels <- lapply(dots, function(.g) editGrob(getGrob(.g,"axis.text.y.text",grep=TRUE), vp=NULL))
  legends <- lapply(dots, function(.g) if(!is.null(.g$children$legends))
                    editGrob(.g$children$legends, vp=NULL) else ggplot2:::.zeroGrob)

  gl <- grid.layout(nrow=length(dots))
  vp <- viewport(layout=gl)
  pushViewport(vp)
  widths.left <- mapply(`+`, e1=lapply(ytitles, grobWidth),
                        e2= lapply(ylabels, grobWidth), SIMPLIFY=F)
  widths.right <- lapply(legends, function(g) grobWidth(g) + if(is.zero(g)) unit(0, "lines") else unit(0.5, "lines")) # safe margin recently added to ggplot2
  widths.left.max <- max(do.call(unit.c, widths.left))
  widths.right.max <- max(do.call(unit.c, widths.right))

  for(ii in seq_along(dots)){
    pushViewport(viewport(layout.pos.row=ii))
    pushViewport(viewport(x=unit(0, "npc") + widths.left.max - widths.left[[ii]],
                          width=unit(1, "npc") - widths.left.max + widths.left[[ii]] -
                                                 widths.right.max + widths.right[[ii]],
                          just="left"))
    grid.draw(dots[[ii]])
  upViewport(2)
  }
}



p <- ggplot(datapoly[datapoly$variable=="val1",], aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
p1 <- ggplot(datapoly[datapoly$variable=="val2",], aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
align.plots( p,p1)

في خطر الإبلاغ عن ما هو واضح ، يبدو أنك يجب أن تكون تلوين من قبل المئوية بدلاً من القيم الخام. ثم تنتقل القيم المحولة والأسطورة من 0 إلى 1.

ربما يكون غير تقليدي قليلاً ، لكن يمكنك محاولة وضع "قيمتك". علي سبيل المثال:

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=factor(value), group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

يستخدم GGPLOT2 عوامل لإنشاء أساطير. لذا ، إذا تمكنت من إضافة عمود يأخذ "القيمة" وينقسمه إلى نطاقات محددة ، فيمكنك استبدال "القيمة" بالنطاقات.

قم بإنشاء عمود ، مثل "F":

    id variable        value   x    y f
1  1.1     val1   0.09838607 2.0 -0.5 0.09-0.13
2  1.1     val1   0.09838607 1.0  0.0 0.09-0.13
3  1.1     val1   0.09838607 1.1  1.0 0.09-0.13
4  1.1     val1   0.09838607 2.2  0.5 0.09-0.13
25 2.1     val1   0.13121347 1.0  0.0 0.13-0.20

...

ثم استخدام:

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=f, group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

يجب عليك تحديد الفئات التي تريدها ، والتي قد تستغرق وقتًا طويلاً. ولكن على الأقل سيخرج الرسم البياني كيف تريد ذلك. في الأساس ، ستقوم بإعادة ترميز البيانات في عمود آخر. وهنا بعض الأمثلة:

http://www.statmethods.net/management/variables.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top