أساطير مختلفة وألوان ملء لـ GGPLOT؟
سؤال
آسف لعدم تضمين أي بيانات مثال لمشكلتي. لم أتمكن من العثور على طريقة لإنتاج ملف شكل مثال بسهولة. نأمل ، مستخدمين ذوي خبرة 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
يجب عليك تحديد الفئات التي تريدها ، والتي قد تستغرق وقتًا طويلاً. ولكن على الأقل سيخرج الرسم البياني كيف تريد ذلك. في الأساس ، ستقوم بإعادة ترميز البيانات في عمود آخر. وهنا بعض الأمثلة: