আমি একটি তৈরি করার চেষ্টা করছি facet_multi_col()
ফাংশন, অনুরূপ facet_col()
ফাংশন ggforce
যে একটি স্থান যুক্তি সঙ্গে একটি পল বিন্যাস (যা পাওয়া যায় না জন্য করতে পারবেন - facet_wrap()
) - কিন্তু ওভার একাধিক কলাম। নীচের শেষ চক্রান্তের মতো (এর সাথে তৈরি grid.arrange()
) আমি চাই না যে প্রয়োজনীয় দিকগুলি সারিগুলি জুড়ে সারিবদ্ধভাবে সংযুক্ত করা হোক কারণ প্রতিটি ফ্যাক্টের উচ্চতাটি y
আমি ব্যবহার করতে চাই এমন একটি শ্রেণিবদ্ধ ভেরিয়েবলের ভিত্তিতে পরিবর্তিত হবে ।
ggproto
এক্সটেনশন গাইডটি পড়ে আমি নিজের গভীরতার বাইরে নিজেকে খুঁজে পাচ্ছি । আমি মনে করি যে facet_col
উপাত্তের সাথে সম্পর্কিত সাবটেক্টগুলির জন্য কলামগুলি কোথায় ভাঙ্গতে হবে এবং যেখানে কোনও স্পেস প্যারামিটার অন্তর্ভুক্ত করার জন্য জিজিফোর্স তৈরি করা উচিত - সেখানে প্রশ্নের শেষটি দেখুন সর্বোত্তম পন্থা layout
আমার অসন্তুষ্ট বিকল্পগুলির একটি দ্রুত চিত্রণ
কোন রূপ নেই
library(tidyverse)
library(gapminder)
global_tile <- ggplot(data = gapminder, mapping = aes(x = year, y = fct_rev(country), fill = lifeExp)) +
geom_tile()
global_tile
আমি মহাদেশগুলি দ্বারা প্লটটি ভেঙে দিতে চাই। আমি এত দীর্ঘ চিত্র চাই না।
facet_wrap ()
global_tile +
facet_wrap(facets = "continent", scales = "free")
facet_wrap()
স্পেস আর্গুমেন্ট নেই যার অর্থ টাইলগুলি প্রতিটি মহাদেশে বিভিন্ন আকারের হয় coord_equal()
ত্রুটি ছুঁড়ে ব্যবহার করে
জিজিফোর্সে facet_col ()
library(ggforce)
global_tile +
facet_col(facets = "continent", scales = "free", space = "free", strip.position = "right") +
theme(strip.text.y = element_text(angle = 0))
পাশের স্ট্রিপগুলির মতো Like space
আর্গুমেন্ট সমস্ত টাইল একই আকারে সেট করে। একটি পৃষ্ঠায় ফিট করার জন্য এখনও অনেক দীর্ঘ।
গ্রিডএক্সট্রায় গ্রিড.আরঞ্জ ()
যেখানে প্রতিটি মহাদেশ স্থাপন করা উচিত সেখানে ডেটাতে একটি কলাম কলাম যুক্ত করুন
d <- gapminder %>%
as_tibble() %>%
mutate(col = as.numeric(continent),
col = ifelse(test = continent == "Europe", yes = 2, no = col),
col = ifelse(test = continent == "Oceania", yes = 3, no = col))
head(d)
# # A tibble: 6 x 7
# country continent year lifeExp pop gdpPercap col
# <fct> <fct> <int> <dbl> <int> <dbl> <dbl>
# 1 Afghanistan Asia 1952 28.8 8425333 779. 3
# 2 Afghanistan Asia 1957 30.3 9240934 821. 3
# 3 Afghanistan Asia 1962 32.0 10267083 853. 3
# 4 Afghanistan Asia 1967 34.0 11537966 836. 3
# 5 Afghanistan Asia 1972 36.1 13079460 740. 3
# 6 Afghanistan Asia 1977 38.4 14880372 786. 3
tail(d)
# # A tibble: 6 x 7
# country continent year lifeExp pop gdpPercap col
# <fct> <fct> <int> <dbl> <int> <dbl> <dbl>
# 1 Zimbabwe Africa 1982 60.4 7636524 789. 1
# 2 Zimbabwe Africa 1987 62.4 9216418 706. 1
# 3 Zimbabwe Africa 1992 60.4 10704340 693. 1
# 4 Zimbabwe Africa 1997 46.8 11404948 792. 1
# 5 Zimbabwe Africa 2002 40.0 11926563 672. 1
# 6 Zimbabwe Africa 2007 43.5 12311143 470. 1
facet_col()
প্রতিটি কলামের জন্য প্লটের জন্য ব্যবহার করুন
g <- list()
for(i in unique(d$col)){
g[[i]] <- d %>%
filter(col == i) %>%
ggplot(mapping = aes(x = year, y = fct_rev(country), fill = lifeExp)) +
geom_tile() +
facet_col(facets = "continent", scales = "free_y", space = "free", strip.position = "right") +
theme(strip.text.y = element_text(angle = 0)) +
# aviod legends in every column
guides(fill = FALSE) +
labs(x = "", y = "")
}
একটি কিংবদন্তি ব্যবহার করে যা তৈরি get_legend()
মধ্যেcowplot
library(cowplot)
gg <- ggplot(data = d, mapping = aes(x = year, y = country, fill = lifeExp)) +
geom_tile()
leg <- get_legend(gg)
প্রতিটি কলামে দেশের সংখ্যার ভিত্তিতে উচ্চতা সহ একটি বিন্যাস ম্যাট্রিক্স তৈরি করুন।
m <-
d %>%
group_by(col) %>%
summarise(row = n_distinct(country)) %>%
rowwise() %>%
mutate(row = paste(1:row, collapse = ",")) %>%
separate_rows(row) %>%
mutate(row = as.numeric(row),
col = col,
p = col) %>%
xtabs(formula = p ~ row + col) %>%
cbind(max(d$col) + 1) %>%
ifelse(. == 0, NA, .)
head(m)
# 1 2 3
# 1 1 2 3 4
# 2 1 2 3 4
# 3 1 2 3 4
# 4 1 2 3 4
# 5 1 2 3 4
# 6 1 2 3 4
tail(m)
# 1 2 3
# 50 1 2 NA 4
# 51 1 2 NA 4
# 52 1 2 NA 4
# 53 NA 2 NA 4
# 54 NA 2 NA 4
# 55 NA 2 NA 4
আনুন g
এবং leg
একসাথে ব্যবহার grid.arrange()
করেgridExtra
library(gridExtra)
grid.arrange(g[[1]], g[[2]], g[[3]], leg, layout_matrix = m, widths=c(0.32, 0.32, 0.32, 0.06))
এটি প্রায় আমার পরে, তবে আমি ক হিসাবে সন্তুষ্ট নই) দীর্ঘতম দেশ এবং মহাদেশের নামগুলির দৈর্ঘ্য সমান নয় এবং খ) বিভিন্ন কলামের টাইলগুলির বিভিন্ন প্রস্থ রয়েছে এবং এর প্রতিটি কোডই প্রতিটি টুইট করার দরকার রয়েছে code সময় আমি এই জাতীয় একটি প্লট তৈরি করতে চাই - অন্যান্য ডেটা সহ আমি অঞ্চলগুলি অনুসারে দিকগুলি সাজিয়ে তুলতে চাই, যেমন "পশ্চিম ইউরোপ" মহাদেশগুলি বা দেশের সংখ্যা পরিবর্তনের পরিবর্তে - gapminder
তথ্যে কোনও মধ্য এশীয় দেশ নেই ।
একটি ফেসট_মલ્ટি_কুল () ফাংশন তৈরির সাথে অগ্রগতি
আমি একটি লেআউট ম্যাট্রিক্সকে একটি রূপের ফাংশনে পাস করতে চাই, যেখানে ম্যাট্রিক্স প্রতিটি দিককে বোঝায় এবং ফাংশনটি তখন প্রতিটি প্যানেলে ফাঁকের সংখ্যার উপর ভিত্তি করে উচ্চতাগুলি নির্ধারণ করতে পারে। উপরের উদাহরণের জন্য ম্যাট্রিক্সটি হ'ল:
my_layout <- matrix(c(1, NA, 2, 3, 4, 5), nrow = 2)
my_layout
# [,1] [,2] [,3]
# [1,] 1 2 4
# [2,] NA 3 5
উপরে উল্লিখিত হিসাবে, আমি facet_col()
কোনও facet_multi_col()
ফাংশন চেষ্টা করার জন্য কোডটি থেকে মানিয়ে নিয়েছি । উপরের layout
মতো ম্যাট্রিক্স সরবরাহের জন্য আমি একটি যুক্তি যুক্ত করেছি my_layout
, এই ধারণাটি সহ, উদাহরণস্বরূপ, facets
যুক্তির প্রদত্ত ভেরিয়েবলের চতুর্থ এবং পঞ্চম স্তরের তৃতীয় কলামে প্লট করা হয়েছে।
facet_multi_col <- function(facets, layout, scales = "fixed", space = "fixed",
shrink = TRUE, labeller = "label_value",
drop = TRUE, strip.position = 'top') {
# add space argument as in facet_col
space <- match.arg(space, c('free', 'fixed'))
facet <- facet_wrap(facets, col = col, dir = dir, scales = scales, shrink = shrink, labeller = labeller, drop = drop, strip.position = strip.position)
params <- facet$params
params <- facet$layout
params$space_free <- space == 'free'
ggproto(NULL, FacetMultiCols, shrink = shrink, params = params)
}
FacetMultiCols <- ggproto('FacetMultiCols', FacetWrap,
# from FacetCols to allow for space argument to work
draw_panels = function(self, panels, layout, x_scales, y_scales, ranges, coord, data, theme, params) {
combined <- ggproto_parent(FacetWrap, self)$draw_panels(panels, layout, x_scales, y_scales, ranges, coord, data, theme, params)
if (params$space_free) {
widths <- vapply(layout$PANEL, function(i) diff(ranges[[i]]$x.range), numeric(1))
panel_widths <- unit(widths, "null")
combined$widths[panel_cols(combined)$l] <- panel_widths
}
combined
}
# adapt FacetWrap layout to set position on panels following the matrix given to layout in facet_multi_col().
compute_layout = function(self, panels, layout, x_scales, y_scales, ranges, coord, data, theme, params) {
layout <- ggproto_parent(FacetWrap, self)$compute_layout(panels, layout, x_scales, y_scales, ranges, coord, data, theme, params)
# ???
)
আমি মনে করি compute_layout
অংশটির জন্য আমার কিছু লেখা দরকার , তবে কীভাবে এটি করা যায় তা নির্ধারণ করার জন্য আমি লড়াই করছি।
grid.arrange
উপরের উদাহরণে .. যদি না আপনি অন্যরকম কিছু বোঝেন ? আমি মনে করি প্রতিটি কলামে বিভিন্ন লেবেলের দৈর্ঘ্যের সাথে একই সমস্যা থাকবে?
grid.arrange
। এটি একটি দীর্ঘ পোস্ট তাই আপনার চেষ্টা করা সমস্ত কিছু অনুসরণ করা শক্ত। কিছুটা হ্যাকি, তবে আপনি লেবেলগুলির জন্য একত্রে ব্যবধানযুক্ত ফন্টের কাছাকাছি একটি মনোস্পেস / চেষ্টা করতে পারেন যাতে তাদের দৈর্ঘ্য আরও অনুমানযোগ্য। এমনকি পাঠ্যটি একই দৈর্ঘ্যের নিকটে রয়েছে কিনা তা নিশ্চিত করার জন্য আপনি ফাঁকা ফাঁকা জায়গাগুলির সাথে লেবেলগুলি প্যাড করতে পারেন।