在gtable_matrix中的多个ggplot数字中画一条线

时间:2018-06-04 16:35:21

标签: r ggplot2 grid gtable

我试图在gtable_matrix中绘制一条横跨两个ggplot直方图的线,以便一个直方图中的值的平均值覆盖在两个图上。

但是,我无法获得绘图区域的设备坐标。在基本图形中,我会使用grconvertX(),但是在哪里可以找到ggplot绘图区域的设备坐标,这样我就可以将“用户”刻度(0-10)上的数字转换为设备坐标?

在下面的示例中,我仔细地找到要插入的数字以使线条处于正确的位置,但是一旦重新调整绘图,或者轴标签发生变化,或者任何其他绘图元素发生变化,它就会中断下。可能无法在您的机器上按预期工作。

import socket
import sockData

IP = "127.0.0.1"
PORT = 5200

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connecting to remote computer 80
server_address = (IP,PORT)
sock.connect(server_address)
# Sending data to server


x = input('enter firstname:')
sockData.send.sendData(sock, x)
y = input("enter lastname:")
sockData.send.sendData(sock, y)

server_msg = sockData.receive.recvData(sock, 1024)
print (server_msg)


# Closing the socket
sock.close()

enter image description here

1 个答案:

答案 0 :(得分:0)

这是一个带有刻面的精简版。您可以决定这是否足以完成您要删除的gtable内容。

使用geom_vline并将截距设置为y值的平均值;这将把它放在每个方面的相同位置。我拿出了带状文本(strip.text = element_blank())来模仿你删除两个图的标题所做的事情。除此之外,它只是一组标准的facet_wrap

library(tidyverse)

n_1 = 10
n_2 = 10
mean_1 = 5.5
sd_1 = 1
mean_2 = 7
sd_2 = 1
data = data.frame(y = c(
  rnorm(n_1, mean_1, sd_1),
  rnorm(n_2, mean_2, sd_2)
),
group = c(rep("1", n_1), rep("2", n_2)))
data$y[data$y > 10] <- 10
data$y[data$y < 0] <- 0

ggplot(data, aes(x = y, fill = group)) +
  geom_histogram(breaks = seq(0, 10, length.out = 12)) +
  geom_vline(aes(xintercept = mean(y))) +
  facet_wrap(~ group, ncol = 1) +
  theme_minimal() +
  theme(strip.text = element_blank())