Scatterplot với biểu đồ biên trong ggplot2


137

Có cách nào để tạo các biểu đồ tán xạ với biểu đồ biên giống như trong mẫu dưới đây ggplot2không? Trong Matlab, nó là scatterhist()hàm và tồn tại tương đương với R. Tuy nhiên, tôi chưa thấy nó cho ggplot2.

phân tán với biểu đồ biên

Tôi đã bắt đầu một nỗ lực bằng cách tạo các biểu đồ đơn nhưng không biết cách sắp xếp chúng đúng cách.

 require(ggplot2)
 x<-rnorm(300)
 y<-rt(300,df=2)
 xy<-data.frame(x,y)
     xhist <- qplot(x, geom="histogram") + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 5/16, axis.text.y = theme_blank(), axis.title.y=theme_blank(), background.colour="white")
     yhist <- qplot(y, geom="histogram") + coord_flip() + opts(background.fill = "white", background.color ="black")

     yhist <- yhist + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 16/5, axis.text.y = theme_blank(), axis.title.y=theme_blank() )


     scatter <- qplot(x,y, data=xy)  + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y)))
none <- qplot(x,y, data=xy) + geom_blank()

và sắp xếp chúng với chức năng được đăng ở đây . Nhưng để làm cho câu chuyện dài ngắn lại: Có cách nào để tạo ra các biểu đồ này không?


@DWin đúng cảm ơn bạn - nhưng tôi nghĩ đó là khá nhiều giải pháp tôi đưa ra trong câu hỏi của mình. tuy nhiên, tôi thích geom_rag () nghĩ rất nhiều do bạn đưa ra dưới đây!
Seb

1
từ một bài đăng blog gần đây rằng các tính năng cùng một chủ đề: blog.mckuhn.de/2009/09/learning-ggplot2-2d-plot-with.html vẻ cũng khá đẹp :)
Seb

Trang web mới cho Thư viện đồ họa là: gallery.r-enthusiasts.com
IRTFM

@Seb bạn có thể cân nhắc thay đổi "câu trả lời được chấp nhận" thành câu trả lời về gói ggExtra nếu bạn nghĩ nó có ý nghĩa
DeanAttali

Câu trả lời:


93

Các gridExtragói nên làm việc ở đây. Bắt đầu bằng cách tạo từng đối tượng ggplot:

hist_top <- ggplot()+geom_histogram(aes(rnorm(100)))
empty <- ggplot()+geom_point(aes(1,1), colour="white")+
         theme(axis.ticks=element_blank(), 
               panel.background=element_blank(), 
               axis.text.x=element_blank(), axis.text.y=element_blank(),           
               axis.title.x=element_blank(), axis.title.y=element_blank())

scatter <- ggplot()+geom_point(aes(rnorm(100), rnorm(100)))
hist_right <- ggplot()+geom_histogram(aes(rnorm(100)))+coord_flip()

Sau đó sử dụng hàm Grid.arrange:

grid.arrange(hist_top, empty, scatter, hist_right, ncol=2, nrow=2, widths=c(4, 1), heights=c(1, 4))

âm mưu


6
1+ để thể hiện vị trí, nhưng bạn không nên thực hiện lại việc lấy mẫu ngẫu nhiên nếu bạn muốn phân tán bên trong "xếp hàng" với các biểu đồ biên.
IRTFM

1
Bạn đúng. Chúng được lấy mẫu từ cùng một phân phối, do đó, biểu đồ biên nên theo lý thuyết phù hợp với biểu đồ phân tán.
oeo4b

8
Trong "lý thuyết", chúng sẽ là "khớp" không có triệu chứng; trong thực tế, số lần chúng sẽ khớp là vô cùng nhỏ. Thật dễ dàng để sử dụng ví dụ được cung cấp xy <- data.frame(x=rnorm(300), y=rt(300,df=2) )và sử dụng data=xytrong các cuộc gọi ggplot.
IRTFM

7
Tôi sẽ không đề xuất giải pháp này vì các ô trục thường không căn chỉnh chính xác. Hy vọng các phiên bản tương lai của ggplot2 sẽ giúp việc căn chỉnh trục dễ dàng hơn hoặc thậm chí cho phép chú thích tùy chỉnh ở các cạnh của bảng điều khiển lô (như các chức năng trục phụ tùy chỉnh trong mạng).
baptiste

9
Không, họ sẽ không, nói chung. ggplot2 hiện xuất ra một chiều rộng bảng điều khiển khác nhau thay đổi tùy thuộc vào phạm vi của nhãn trục, v.v. Hãy xem ggExtra :: align.plots để xem loại hack hiện được yêu cầu để căn chỉnh các trục.
baptiste

115

Đây không phải là một câu trả lời hoàn toàn đáp ứng nhưng nó rất đơn giản. Nó minh họa một phương pháp thay thế để hiển thị mật độ biên và cả cách sử dụng các mức alpha cho đầu ra đồ họa hỗ trợ độ trong suốt:

scatter <- qplot(x,y, data=xy)  + 
         scale_x_continuous(limits=c(min(x),max(x))) + 
         scale_y_continuous(limits=c(min(y),max(y))) + 
         geom_rug(col=rgb(.5,0,0,alpha=.2))
scatter

nhập mô tả hình ảnh ở đây


5
Đó là một cách thú vị để hiển thị mật độ. Cảm ơn đã thêm câu trả lời này. :)
Michelle

21
Cần lưu ý rằng phương pháp này là phổ biến hơn nhiều so với việc đặt biểu đồ biên. Trong thực tế, có các ô thảm là phổ biến trong các bài báo được xuất bản, nơi tôi chưa bao giờ thấy một bài báo được xuất bản với lịch sử cận biên.
Xu Wang

Câu trả lời thay thế rất thú vị và trực quan! Và rất đơn giản! Không có gì ngạc nhiên khi nó nhận được nhiều phiếu hơn so với câu trả lời đúng. Theo tôi hiểu rằng đây thực chất là một chiều Heatmap : các thảm cũng sẫm bất cứ nơi nào là đông đúc. Điều lo lắng duy nhất của tôi là, độ phân giải của bản đồ nhiệt không cao bằng biểu đồ. ví dụ. khi cốt truyện nhỏ, tất cả các tấm thảm sẽ được ép lại với nhau, điều này khiến cho việc nhận biết phân phối trở nên khó khăn. Trong khi biểu đồ không bị giới hạn. Cảm ơn ý kiến!
HongboZhu

94

Điều này có thể hơi muộn, nhưng tôi đã quyết định tạo một gói ( ggExtra) cho việc này vì nó liên quan đến một chút mã và có thể tẻ nhạt để viết. Gói này cũng cố gắng giải quyết một số vấn đề phổ biến như đảm bảo rằng ngay cả khi có tiêu đề hoặc văn bản được phóng to, các ô vẫn sẽ được đặt nội tuyến với nhau.

Ý tưởng cơ bản tương tự như những gì các câu trả lời ở đây đã đưa ra, nhưng nó vượt xa hơn một chút. Dưới đây là một ví dụ về cách thêm biểu đồ biên vào một tập hợp ngẫu nhiên 1000 điểm. Hy vọng rằng điều này làm cho việc thêm biểu đồ / mật độ trong tương lai dễ dàng hơn.

Liên kết với gói ggExtra

library(ggplot2)
df <- data.frame(x = rnorm(1000, 50, 10), y = rnorm(1000, 50, 10))
p <- ggplot(df, aes(x, y)) + geom_point() + theme_classic()
ggExtra::ggMarginal(p, type = "histogram")

nhập mô tả hình ảnh ở đây


1
Cảm ơn rất nhiều cho gói. Nó hoạt động ra khỏi hộp!
heroxbd

Có thể vẽ các ô mật độ cận biên cho các đối tượng được nhóm theo màu với gói này không?
GegznaV

Không, nó không có loại logic đó
DeanAttali

1
@jjrr Tôi không chắc những gì không hoạt động và những vấn đề bạn gặp phải, nhưng có một vấn đề gần đây trên github về kết xuất trong sổ ghi chép và cũng có một giải pháp, đây có thể là github.com/daattali/ ggExtra / vấn đề / 89
DeanAttali

1
@GegznaV, nếu bạn vẫn đang tìm cách để có các ô mật độ cận biên được nhóm theo màu, thì có thể với ggExtra 0.9: ggMarginal (p, type = "mật độ", size = 5, groupColour = TRUE)
MartineJ

46

Một bổ sung, chỉ để tiết kiệm thời gian tìm kiếm cho những người làm điều này sau chúng tôi.

Truyền thuyết, nhãn trục, văn bản trục, đánh dấu làm cho các ô trôi xa nhau, do đó cốt truyện của bạn sẽ trông xấu xí và không nhất quán.

Bạn có thể sửa lỗi này bằng cách sử dụng một số cài đặt chủ đề này,

+theme(legend.position = "none",          
       axis.title.x = element_blank(),
       axis.title.y = element_blank(),
       axis.text.x = element_blank(),
       axis.text.y = element_blank(), 
       plot.margin = unit(c(3,-5.5,4,3), "mm"))

và căn chỉnh quy mô,

+scale_x_continuous(breaks = 0:6,
                    limits = c(0,6),
                    expand = c(.05,.05))

vì vậy kết quả sẽ ổn

một ví dụ


3
xem điều này để có giải pháp đáng tin cậy hơn để sắp xếp các ô cốt truyện
baptiste

Đúng. Câu trả lời của tôi đã lỗi thời, hãy sử dụng giải pháp @baptiste đề xuất.
Lorinc Nyitrai

@LorincNyitrai Bạn có thể vui lòng chia sẻ mã của mình để tạo cốt truyện này không. Tôi cũng có một điều kiện là tôi muốn tạo một biểu đồ phân tán Chính xác-Thu hồi trong ggplot2 với phân phối biên cho 2 nhóm nhưng tôi không thể thực hiện phân phối cận biên cho 2 nhóm. Cảm ơn
Newbie

@Newbie, câu trả lời này là 3 tuổi, càng lỗi thời càng tốt. Sử dụng rdocumentation.org/packages/gtable/versions/0.2.0/topics/gtable hoặc một cái gì đó tương tự.
Lorinc Nyitrai

29

Chỉ là một biến thể rất nhỏ trong câu trả lời của BondedDust , theo tinh thần chung là các chỉ số phân phối biên.

Edward Tufte đã gọi việc sử dụng các ô này là một ô 'dot-dash' và có một ví dụ trong VDQI về việc sử dụng các đường trục để chỉ ra phạm vi của từng biến. Trong ví dụ của tôi, nhãn trục và đường lưới cũng chỉ ra sự phân phối dữ liệu. Các nhãn được đặt tại các giá trị của tóm tắt năm số của Tukey (tối thiểu, bản lề dưới, trung vị, bản lề trên, tối đa), tạo ấn tượng nhanh về sự lây lan của từng biến.

Năm số này là một đại diện số của một boxplot. Đó là một chút khó khăn vì các đường lưới cách đều nhau cho thấy các trục có tỷ lệ phi tuyến tính (trong ví dụ này chúng là tuyến tính). Có lẽ tốt nhất là bỏ qua các đường lưới hoặc buộc chúng phải ở các vị trí thông thường và chỉ để các nhãn hiển thị tóm tắt năm số.

x<-rnorm(300)
y<-rt(300,df=10)
xy<-data.frame(x,y)

require(ggplot2); require(grid)
# make the basic plot object
ggplot(xy, aes(x, y)) +        
  # set the locations of the x-axis labels as Tukey's five numbers   
  scale_x_continuous(limit=c(min(x), max(x)), 
                     breaks=round(fivenum(x),1)) +     
  # ditto for y-axis labels 
  scale_y_continuous(limit=c(min(y), max(y)),
                     breaks=round(fivenum(y),1)) +     
  # specify points
  geom_point() +
  # specify that we want the rug plot
  geom_rug(size=0.1) +   
  # improve the data/ink ratio
  theme_set(theme_minimal(base_size = 18))

nhập mô tả hình ảnh ở đây


12

Vì không có giải pháp thỏa mãn cho loại cốt truyện này khi so sánh các nhóm khác nhau, tôi đã viết một chức năng để làm điều này.

Nó hoạt động cho cả dữ liệu được nhóm và không được nhóm và chấp nhận các tham số đồ họa bổ sung:

marginal_plot(x = iris$Sepal.Width, y = iris$Sepal.Length)

nhập mô tả hình ảnh ở đây

marginal_plot(x = Sepal.Width, y = Sepal.Length, group = Species, data = iris, bw = "nrd", lm_formula = NULL, xlab = "Sepal width", ylab = "Sepal length", pch = 15, cex = 0.5)

nhập mô tả hình ảnh ở đây


9

Tôi đã tìm thấy gói ( ggpubr) có vẻ hoạt động rất tốt cho vấn đề này và nó xem xét một số khả năng để hiển thị dữ liệu.

Liên kết đến gói là ở đây , và trong liên kết này, bạn sẽ tìm thấy một hướng dẫn tốt đẹp để sử dụng nó. Để hoàn thiện, tôi đính kèm một trong những ví dụ tôi đã sao chép.

Lần đầu tiên tôi cài đặt gói (nó yêu cầu devtools)

if(!require(devtools)) install.packages("devtools")
devtools::install_github("kassambara/ggpubr")

Đối với ví dụ cụ thể về việc hiển thị các biểu đồ khác nhau cho các nhóm khác nhau, nó đề cập đến mối quan hệ với ggExtra: "Một hạn chế ggExtralà nó không thể đối phó với nhiều nhóm trong biểu đồ phân tán và các ô cận biên. Trong mã R bên dưới, chúng tôi cung cấp một giải pháp sử dụng cowplotgói. " Trong trường hợp của tôi, tôi đã phải cài đặt gói sau:

install.packages("cowplot")

Và tôi đã làm theo đoạn mã này:

# Scatter plot colored by groups ("Species")
sp <- ggscatter(iris, x = "Sepal.Length", y = "Sepal.Width",
            color = "Species", palette = "jco",
            size = 3, alpha = 0.6)+
border()                                         
# Marginal density plot of x (top panel) and y (right panel)
xplot <- ggdensity(iris, "Sepal.Length", fill = "Species",
               palette = "jco")
yplot <- ggdensity(iris, "Sepal.Width", fill = "Species", 
               palette = "jco")+
rotate()
# Cleaning the plots
sp <- sp + rremove("legend")
yplot <- yplot + clean_theme() + rremove("legend") 
xplot <- xplot + clean_theme() + rremove("legend")
# Arranging the plot using cowplot
library(cowplot)
plot_grid(xplot, NULL, sp, yplot, ncol = 2, align = "hv", 
      rel_widths = c(2, 1), rel_heights = c(1, 2))

Điều này làm việc tốt cho tôi:

Iris thiết lập biểu đồ biên phân tán

nhập mô tả hình ảnh ở đây


Bạn cần làm gì để biến cốt truyện ở giữa thành một hình vuông?
JAQuent

Hình dạng của các chấm bạn có nghĩa là gì? Hãy thử thêm đối số shape = 19vào ggscatter. Mã cho hình dạng ở đây
Alf Pascu

7

Bạn có thể dễ dàng tạo các biểu đồ phân tán hấp dẫn với biểu đồ biên bằng ggstatsplot (nó cũng sẽ phù hợp và mô tả một mô hình):

data(iris)

library(ggstatsplot)

ggscatterstats(
  data = iris,                                          
  x = Sepal.Length,                                                  
  y = Sepal.Width,
  xlab = "Sepal Length",
  ylab = "Sepal Width",
  marginal = TRUE,
  marginal.type = "histogram",
  centrality.para = "mean",
  margins = "both",
  title = "Relationship between Sepal Length and Sepal Width",
  messages = FALSE
)

nhập mô tả hình ảnh ở đây

Hoặc hấp dẫn hơn một chút (theo mặc định) ggpubr :

devtools::install_github("kassambara/ggpubr")
library(ggpubr)

ggscatterhist(
  iris, x = "Sepal.Length", y = "Sepal.Width",
  color = "Species", # comment out this and last line to remove the split by species
  margin.plot = "histogram", # I'd suggest removing this line to get density plots
  margin.params = list(fill = "Species", color = "black", size = 0.2)
)

nhập mô tả hình ảnh ở đây

CẬP NHẬT:

Theo đề xuất của @aickley, tôi đã sử dụng phiên bản phát triển để tạo cốt truyện.


1
Biểu đồ trên trục y là không chính xác vì nó chỉ là một bản sao của trục trên trục x. Điều này chỉ được sửa gần đây github.com/kassambara/ggpubr/issues/85 .
aickley

7

Đây là một câu hỏi cũ, nhưng tôi nghĩ sẽ rất hữu ích khi đăng một bản cập nhật ở đây vì tôi đã gặp phải vấn đề tương tự gần đây (cảm ơn Stefanie Mueller đã giúp đỡ!).

Câu trả lời được đánh giá cao nhất khi sử dụng GridExtra hoạt động, nhưng việc căn chỉnh các trục là khó khăn / khó khăn, như đã được chỉ ra trong các bình luận. Điều này bây giờ có thể được giải quyết bằng lệnh ggMarginal từ gói ggExtra, như sau:

#load packages
library(tidyverse) #for creating dummy dataset only
library(ggExtra)

#create dummy data
a = round(rnorm(1000,mean=10,sd=6),digits=0)
b = runif(1000,min=1.0,max=1.6)*a
b = b+runif(1000,min=9,max=15)

DummyData <- data.frame(var1 = b, var2 = a) %>% 
  filter(var1 > 0 & var2 > 0)

#plot
p = ggplot(DummyData, aes(var1, var2)) + geom_point(alpha=0.3)
ggMarginal(p, type = "histogram")

nhập mô tả hình ảnh ở đây


Chỉ cần nhận ra rằng điều này đã được đăng bởi nhà phát triển gói ggExtra ban đầu trong một câu trả lời khác. Thay vào đó, tôi khuyên bạn nên đưa ra câu trả lời được chấp nhận, vì lý do tôi đã giải thích ở trên!
Victoria Auyeung

6

Tôi đã thử các tùy chọn đó, nhưng không hài lòng với kết quả hoặc mã lộn xộn người ta sẽ cần sử dụng để đạt được điều đó. May mắn cho tôi, Thomas Lin Pedersen chỉ phát triển một gói gọi là chắp vá , giúp công việc được thực hiện một cách khá tao nhã.

Nếu bạn muốn tạo một biểu đồ phân tán với biểu đồ biên, trước tiên bạn phải tạo ba ô đó một cách riêng biệt.

library(ggplot2)

x <- rnorm(300)
y <- rt(300, df = 2)
xy <- data.frame(x, y)

plot1 <- ggplot(xy, aes(x = x, y = y)) + 
  geom_point() 

dens1 <- ggplot(xy, aes(x = x)) + 
  geom_histogram(color = "black", fill = "white") + 
  theme_void()

dens2 <- ggplot(xy, aes(x = y)) + 
  geom_histogram(color = "black", fill = "white") + 
  theme_void() + 
  coord_flip()

Điều duy nhất còn lại phải làm là thêm các ô đó một cách đơn giản +và chỉ định bố cục với hàm plot_layout().

library(patchwork)

dens1 + plot_spacer() + plot1 + dens2 + 
  plot_layout(
    ncol = 2, 
    nrow = 2, 
    widths = c(4, 1),
    heights = c(1, 4)
  ) 

Hàm plot_spacer()thêm một ô trống vào góc trên bên phải. Tất cả các lập luận khác nên tự giải thích.

nhập mô tả hình ảnh ở đây

Vì biểu đồ phụ thuộc rất nhiều vào độ rộng băng đã chọn, nên người ta có thể lập luận thích các ô mật độ. Với một số sửa đổi nhỏ, người ta sẽ nhận được ví dụ cho dữ liệu theo dõi mắt một cốt truyện đẹp.

library(ggpubr)

plot1 <- ggplot(df, aes(x = Density, y = Face_sum, color = Group)) + 
  geom_point(aes(color = Group), size = 3) + 
  geom_point(shape = 1, color = "black", size = 3) + 
  stat_smooth(method = "lm", fullrange = TRUE) +
  geom_rug() + 
  scale_y_continuous(name = "Number of fixated faces", 
                     limits = c(0, 205), expand = c(0, 0)) + 
  scale_x_continuous(name = "Population density (lg10)", 
                     limits = c(1, 4), expand = c(0, 0)) + 
  theme_pubr() +
  theme(legend.position = c(0.15, 0.9)) 

dens1 <- ggplot(df, aes(x = Density, fill = Group)) + 
  geom_density(alpha = 0.4) + 
  theme_void() + 
  theme(legend.position = "none")

dens2 <- ggplot(df, aes(x = Face_sum, fill = Group)) + 
  geom_density(alpha = 0.4) + 
  theme_void() + 
  theme(legend.position = "none") + 
  coord_flip()

dens1 + plot_spacer() + plot1 + dens2 + 
  plot_layout(ncol = 2, nrow = 2, widths = c(4, 1), heights = c(1, 4))

nhập mô tả hình ảnh ở đây

Mặc dù dữ liệu không được cung cấp tại thời điểm này, các nguyên tắc cơ bản nên rõ ràng.


4

Để xây dựng câu trả lời của @ alf-pascu, hãy thiết lập từng ô theo cách thủ công và sắp xếp chúng với cowplotcác khoản trợ cấp rất linh hoạt đối với cả cốt truyện chính và cốt truyện (so với một số giải pháp khác). Phân phối theo nhóm là một ví dụ. Thay đổi cốt truyện chính thành một âm mưu mật độ 2D là một âm mưu khác.

Sau đây tạo ra một biểu đồ phân tán với biểu đồ biên (được căn chỉnh chính xác).

library("ggplot2")
library("cowplot")

# Set up scatterplot
scatterplot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  geom_point(size = 3, alpha = 0.6) +
  guides(color = FALSE) +
  theme(plot.margin = margin())


# Define marginal histogram
marginal_distribution <- function(x, var, group) {
  ggplot(x, aes_string(x = var, fill = group)) +
    geom_histogram(bins = 30, alpha = 0.4, position = "identity") +
    # geom_density(alpha = 0.4, size = 0.1) +
    guides(fill = FALSE) +
    theme_void() +
    theme(plot.margin = margin())
}

# Set up marginal histograms
x_hist <- marginal_distribution(iris, "Sepal.Length", "Species")
y_hist <- marginal_distribution(iris, "Sepal.Width", "Species") +
  coord_flip()

# Align histograms with scatterplot
aligned_x_hist <- align_plots(x_hist, scatterplot, align = "v")[[1]]
aligned_y_hist <- align_plots(y_hist, scatterplot, align = "h")[[1]]

# Arrange plots
plot_grid(
  aligned_x_hist
  , NULL
  , scatterplot
  , aligned_y_hist
  , ncol = 2
  , nrow = 2
  , rel_heights = c(0.2, 1)
  , rel_widths = c(1, 0.2)
)

phân tán với biểu đồ biên

Để vẽ một âm mưu mật độ 2D thay vào đó, chỉ cần thay đổi cốt truyện chính.

# Set up 2D-density plot
contour_plot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  stat_density_2d(aes(alpha = ..piece..)) +
  guides(color = FALSE, alpha = FALSE) +
  theme(plot.margin = margin())

# Arrange plots
plot_grid(
  aligned_x_hist
  , NULL
  , contour_plot
  , aligned_y_hist
  , ncol = 2
  , nrow = 2
  , rel_heights = c(0.2, 1)
  , rel_widths = c(1, 0.2)
)

nhập mô tả hình ảnh ở đây


3

Một giải pháp khác sử dụng ggpubrcowplot, nhưng ở đây chúng tôi tạo các ô bằng cách sử dụng cowplot::axis_canvasvà thêm chúng vào cốt truyện gốc với cowplot::insert_xaxis_grob:

library(cowplot) 
library(ggpubr)

# Create main plot
plot_main <- ggplot(faithful, aes(eruptions, waiting)) +
  geom_point()

# Create marginal plots
# Use geom_density/histogram for whatever you plotted on x/y axis 
plot_x <- axis_canvas(plot_main, axis = "x") +
  geom_density(aes(eruptions), faithful)
plot_y <- axis_canvas(plot_main, axis = "y", coord_flip = TRUE) +
  geom_density(aes(waiting), faithful) +
  coord_flip()

# Combine all plots into one
plot_final <- insert_xaxis_grob(plot_main, plot_x, position = "top")
plot_final <- insert_yaxis_grob(plot_final, plot_y, position = "right")
ggdraw(plot_final)

nhập mô tả hình ảnh ở đây


2

Ngày nay, có ít nhất một gói CRAN tạo ra sự phân tán với biểu đồ biên của nó.

library(psych)
scatterHist(rnorm(1000), runif(1000))

Cốt truyện mẫu từ scatterHist


0

Bạn có thể sử dụng hình thức tương tác ggExtra::ggMarginalGadget(yourplot) và lựa chọn giữa các ô vuông, ô vĩ cầm, ô mật độ và biểu đồ trắng dễ dàng.

như thế

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.