Редактировать, чтобы объединить положения полос facet_wrap
с размерами свободных панелей facet_grid
(Примечание: я увеличил размеры сегментов, потому что их было действительно трудно увидеть. ..)
# data d was created with set.seed(123)
# generate plot without either facet option
p <- d %>%
arrange(organism_name, desc(protein_length)) %>%
mutate(protein_name = factor(protein_name,
levels = unique(protein_name))) %>%
ggplot(aes(x = 1, xend = protein_length,
y = protein_name, yend = protein_name)) +
geom_segment(color = rgb(0, 0, 0), size = 4) +
geom_segment(aes(x = start, xend = end, y = protein_name,
yend = protein_name, color = as.factor(group)),
size = 3) +
scale_x_continuous(breaks = seq(0,500,100), labels = seq(0,500,100)) +
scale_y_discrete(label = NULL, drop = T) +
scale_color_manual(values = c("firebrick1", "dodgerblue1", "darkgoldenrod1")) +
theme_minimal() +
labs(color = "Group", y = "Proteins", x = "Amino Acid Position") +
theme(axis.title.x = element_text(size = 15, face = "bold", vjust = 0.5),
axis.text.x = element_text(size = 12),
panel.grid.minor.x = element_blank(),
axis.title.y = element_text(size = 15, face = "bold", vjust = 0.5),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
legend.title = element_text(size = 15, face = "bold"),
legend.text = element_text(size = 12))
# create two versions of the plot using facet_grid / facet_wrap,
# with scales set to "free_y" for both, but also space = "free_y" for facet_grid
# (facet_wrap doesn't have this option)
p.grid <- p + facet_grid(organism_name ~ ., scales = "free_y", space = "free_y")
p.wrap <- p + facet_wrap(~ organism_name, ncol = 1, scales = "free_y")
# convert both into grob objects
gp.grid <- ggplotGrob(p.grid)
gp.wrap <- ggplotGrob(p.wrap)
# apply the panel heights of the facet_grid version to the facet_wrap one
gp.wrap$heights[gp.wrap$layout[grep("panel", gp.wrap$layout$name), "t"]] <-
gp.grid$heights[gp.grid$layout[grep("panel", gp.grid$layout$name), "t"]]
# plot the facet_wrap version
grid::grid.draw(gp.wrap)
Оригинальный ответ
Похоже, вы выглядите для facet_grid
вместо facet_wrap
. Это позволяет изменять разрывы осей и высоты граней, если вы установите scales
и amp; space
- "free_y"
:
d %>%
arrange(organism_name, desc(protein_length)) %>%
mutate(protein_name = factor(protein_name,
levels = unique(protein_name))) %>%
ggplot(aes(x = 1, xend = protein_length,
y = protein_name, yend = protein_name)) +
geom_segment(color = rgb(0, 0, 0), size = 1) +
geom_segment(aes(x = start, xend = end, y = protein_name,
yend = protein_name, color = as.factor(group)),
size = 0.7) +
scale_x_continuous(breaks = seq(0,500,100), labels = seq(0,500,100)) +
scale_y_discrete(label = NULL, drop = T) +
scale_color_manual(values = c("firebrick1", "dodgerblue1", "darkgoldenrod1")) +
facet_grid(organism_name ~ ., drop = T,
scales = "free_y", space = "free_y") +
theme_minimal() +
labs(color = "Group", y = "Proteins", x = "Amino Acid Position") +
theme(axis.title.x = element_text(size = 15, face = "bold", vjust = 0.5),
axis.text.x = element_text(size = 12),
panel.grid.minor.x = element_blank(),
axis.title.y = element_text(size = 15, face = "bold", vjust = 0.5),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
legend.title = element_text(size = 15, face = "bold"),
legend.text = element_text(size = 12))
да, существует более простой/лучше путь, особенно в Java или других языках OO.
Основное понимание, во-первых, то, что Ваш синтаксический анализатор команды является конечным автоматом: Начальное состояние является пустой строкой (или индекс в начале строки).
Давайте думать о echo
:
$ echo foo bat "bletch quux"
маркируйте строку в части:
"повторите" "нечто" "панель" "bletch quux"
в оболочке грамматика обычно является существительным существительного существительного глагола..., так интерпретируйте его тот путь. Вы CAN делает это с последовательностью того, если еще, если вещи, но хеш лучше. Вы загружаете хеш строками как индексы и индексируете что-то еще. Это могло быть просто число, которое войдет в переключатель:
(это - псевдокод):
Hashtable cmds = new Hashtable();
enum cmdindx { ECHO=1, LS=2, ...}
cmds.add("echo", ECHO); // ...
// get the token into tok
switch (cmds.get(tok)) {
case ECHO: // process it
// get each successor token and copy it to stdout
break;
...
default:
// didn't recognize the token
// process errors
}
ЕЩЕ лучше можно применить Команду и Объектные Шаблоны "фабрика". Теперь у Вас есть класс Команда
public interface Command {
public void doThis(String[] nouns) ;
public Command factory();
}
public class Echo implements Command {
public void doThis(String[] nouns){
// the code is foreach noun in nouns, echo it
}
public Command factory(){
// this clones the object and returns it
}
}
Теперь, Ваш код становится
// Load the hash
Hashtable cmds = new Hashtable();
cmds.add("echo", new Echo()); // one for each command
// token is in tok
// the "nouns" or "arguments are in a String[] nouns
((cmds.get(tok)).factory()).doThis(nouns);
Посмотрите, как это работает? Вы ищете объект в хеше. Вы звоните factory
метод для получения новой копии. Вы затем вызываете обработку для той команды с помощью doThis
метод.
Это может быть немного слишком общим, в котором это использует Шаблон "фабрика". Почему имеет метод фабрики? Главным образом Вы использовали бы это так, чтобы каждый раз Вы выполнили команду, объект "глагола" (как экземпляр Echo
) может иметь его собственное внутреннее состояние. Если Вы не должны заявлять для сохранения в течение долгого времени, можно упростить это до
(cmds.get(tok)).doThis(nouns);
Теперь это просто получает и использует Echo
возразите, что Вы создали когда Вы instanciated это с cmds.add("echo", new Echo());
.
Вы посмотрели на выполнение диспетчеризации с Картой? hashmap было бы довольно легко поместить там. Просто сделайте ключ командой и сделайте интерфейсный или абстрактный класс, который является командой как это:
interface Commmand {
void execute(String args);
}
Или еще лучше Вы могли нарубить аргументы заранее:
interface Commmand {
void execute(String[] args);
}
Затем Ваш Вы использовали бы HashMap <Строка, Команда>.