【发布时间】:2017-10-11 18:58:03
【问题描述】:
想象一下我绘制了这个玩具数据:
lev <- c("A", "B", "C", "D")
nodes <- data.frame(ord=c(1,1,1,2,2,3,3,4), brand=
factor(c("A", "B", "C","B", "C","D", "B","D"), levels=lev),
thick=c(16,9,9,16,4,1,4,1))
edge <- data.frame(ord1=c(1,1,2,3), brand1=factor(c("C","A","B","B"),
levels=lev),ord2=c(2,2,3,4), brand2=c("C","B","B","D"),
N1=c(2,1,2,1), N2=c(5,5,2,1))
ggplot() +
geom_point(data = nodes,
aes(x = ord, y = brand, size = sqrt(thick)),
color = "black", shape = 16, show.legend = T) +
scale_x_continuous(limits=c(1, 4), breaks=seq(0,4,1),
minor_breaks = NULL) +
geom_segment(data = edge,
aes(x = ord1, y = brand1, xend = ord2, yend = brand2),
color = "blue", size = edge$N2/edge$N1) +
ylim(lev) +
theme_bw()
我想添加另一个与线段宽度和 N2/N1 相关的图例(在节点下方)。
PD: 根据您的一些建议...
ggplot() +
geom_segment(data = edge,
aes(x = ord1, y = brand1, xend = ord2, yend = brand2, size = N2/N1),
color = "blue", show.legend = T) +
geom_point(data = nodes,
aes(x = ord, y = brand, size = thick),
color = "black", shape = 16, show.legend = T) +
scale_x_continuous(limits = c(1, 4), breaks = 0:4,
minor_breaks = NULL) +
scale_size_continuous(trans = "sqrt", breaks = c(1,4,9,16)) +
ylim(lev) + theme_bw()
我得到了图例,但它与另一个重叠。
我可以尝试使用颜色而不是宽度:
ggplot()+ geom_segment(data=edge, aes(x=ord1, y=brand1, xend=ord2, yend=brand2, alpha=N2/N1) , size=1 ,show.legend = T) +
geom_point(data=nodes,aes(x=ord, y=brand, size=thick), color="black", shape=16,show.legend = T) +
scale_x_continuous(limits=c(1, 4), breaks=seq(0,4,1), minor_breaks = NULL) + scale_size_continuous(trans = "sqrt", breaks=c(1,4,9,16)) +
ylim(lev) + theme_bw()
虽然我更喜欢原始的宽度方法,因为在我的真实情节中,我会有很多线交叉。
PD:任何具有 lattice 的解决方案或任何能够导出为 svg 或矢量 pdf 的替代方案?
PD2:我发现了另一个问题,细点没有正确缩放,有时无法强制 ggplot 显示正确的图例: How can I force ggplot to show more levels on the legend?
【问题讨论】:
-
不要对数据的大小进行平方根,而是按比例计算:
scale_size_continuous(trans = "sqrt")。这将解决您的标签问题(第一个项目符号)。为线条粗细添加单独的图例会更加困难......当他们关注单个问题而不是很多东西时,问题会更好。 -
1) 2) 要获得图例,您需要使用 aes 来映射宽度 3) 最后绘制点,以便它们位于段的顶部。
-
1) Gregor 的答案的替代方法是使用
scale_size_area(),它将数据映射到点的区域而不是默认情况下的直径,2) 段厚度的关键将需要在非常至少要使用aes()来映射段的大小 3) 最后绘制点,使它们位于段的顶部。我怀疑你的一些问题一定已经得到了回答。第一个和第三个是微不足道的,关于段大小的,可能对其他人有用。检查答案是否存在,如果不存在,请为它写一个新问题,并带有描述性标题。 -
@Gregor 如果有多个变量,我在哪里指定要转换的变量?我如何指定这些数字的限制?因为我试过了,只能看到4到16,我想要1到16
-
@PedroAphalo 我更喜欢转换它,因为我也可以使用对数或平方。