我有一个图表来绘制点,文本和边,以在png中导出.以下是当前的代码.

node <- data.frame(id=c(1,2,3), x=c(1,2,1), y=c(1,1,2), label=c("a","b","c"))
edge <- data.frame(from=c(1,1,2), to=c(2,3,3))
g <- graph_from_data_frame(d=edge, vertices=node, directed=F)


cor <- matrix(c(V(g)$x, y=V(g)$y), ncol=2)

p <- g %>% ggraph(layout=cor) +
## Base settings
  geom_edge_link(width=3, color="gray70") +
  geom_node_point(size=22, aes(x=x, y=y)) +
  geom_node_text(size=16, color="white", fontface=2, vjust=0.4, aes(x=x, y=y, label=label)) +
## Set axis
  expand_limits(x=1, y=1) +
  coord_fixed() +
## Set legend
  scale_color_manual(name=tname, labels=plabel, values=pname) +
## Theme
theme(
  ## Font size
  plot.title=element_blank(),
  axis.title.y=element_blank(),
  axis.title.x.top=element_blank(),
  axis.text=element_blank(),
  legend.title=element_blank(),
  legend.text=element_blank(),
  legend.position="none",
  ## Appearance
  panel.background=element_rect(fill="transparent"),
  panel.grid.major=element_blank(),
  legend.key=element_blank()
  )

ggsave(p, file="test.png", width=5, height=5, dpi=100)

它会生成以下图像. node 和文本被截断,因此我将widthheight更改为较大的值ggsave,以使其适合绘图区域.但 node 尺寸变小了.

enter image description here

enter image description here

由于我需要在有限的空间内将大量图形放入文档中,因此我不想使 node 和文本的大小变小.此外,它可能不适合以二次方式更改expand_limits(x=1, y=1)的值,因为我需要在固定和有限的大小内将图形导出为尽可能大的图像(在本例中,‘Width=5,Height=5’). 有什么方法或参数可以在绘图区内绘制 node 和文本吗?我在theme()模式下try 了margin()模式,但它可以设置图块区域之外的行进模式.

推荐答案

一种 Select 是

  1. 删除x和y比例的默认扩展,
  2. 将(即使不可见)轴刻度的长度设置为零,
  3. 使用clip="off"可防止在点击面板边框时剪切点和文本
  4. 最后,根据您的点的大小设置plot.margin,例如,9 mm的边距对于22点的大小很好.(实际上,我希望22/2=11可以很好地工作.)
library(ggraph)
library(tidygraph)
library(igraph)

p <- g %>% 
  ggraph(layout = cor) +
  ## Base settings
  geom_edge_link(width = 3, color = "gray70") +
  geom_node_point(size = 22, aes(x = x, y = y)) +
  geom_node_text(
    size = 16, color = "white", fontface = 2, vjust = 0.4,
    aes(x = x, y = y, label = label)
  ) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  ## Set axis
  expand_limits(x = 1, y = 1) +
  coord_fixed(clip = "off") +
  ## Set legend
  # scale_color_manual(name = tname, labels = plabel, values = pname) +
  ## Theme
  theme(
    ## Font size
    plot.title = element_blank(),
    axis.title.y = element_blank(),
    axis.title.x.top = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    axis.line = element_blank(),
    axis.ticks.length = unit(0, "pt"),
    legend.title = element_blank(),
    legend.text = element_blank(),
    legend.position = "none",
    ## Appearance
    panel.background = element_rect(fill = "transparent"),
    panel.grid.major = element_blank(),
    legend.key = element_blank(),
    plot.margin = unit(rep(9, 4), units = "mm")
  )

ggsave(p, file = "test.png", width = 5, height = 5, dpi = 100)

enter image description here

对于更大的尺寸

ggsave(p, file = "test.png", width = 20, height = 20, dpi = 100, scale = .5)

enter image description here

R相关问答推荐

确定邻国

pivot_longer:names_to和names_pattern

如何使用ggplot重新绘制LASO回归图?

是否有任何解决方案可以优化VSCode中RScript的图形绘制?

在位置周围设定一个半径并识别该半径内的其他位置

为什么在ggplot2中添加geom_text这么慢?

计算具有奇数日期的运行金额

par函数中的缩写,比如mgp,mar,mai是如何被破译的?

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

为什么我的基准测试会随着样本量的增加而出现一些波动?

如果可能,将数字列转换为整数,否则保留为数字

将多列合并为单独的名称—值对

迭代到DataFrame列并获得成对的值列表(col1->;col2、col2->;col3、col3->;col4等)的正确方法.

为什么我使用geom_density的绘图不能到达x轴?

以NA为通配符的R中的FULL_JOIN以匹配其他数据中的任何值.Frame

为左表中的所有行使用值Fill滚动左连接

按组计算列中1出现的间隔年数

为什么不能使用lApply在包装函数中调用子集

如何在刻面和翻转堆叠条形图中对齐geom_text()

在GT()中的列之间添加空格