Отрегулируйте дискретную высоту оси Y для количества сегментов в фасетах

Используйте литерал regex [MDN] :

var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;

Вы делаете две ошибки, когда используете RegExp [MDN] :

  • «Разделители» / не должны быть частью выражения
  • . Если вы определяете выражение как строку, вам нужно избежать обратного слэша, потому что это escape-символ в строках

Кроме того, модификаторы передаются как второй аргумент функции.

Итак, если вы хотите использовать RegExp (который вы не используете в этом случае), эквивалент был бы следующим:

var reg = new RegExp("\\(\\s*([0-9.-]+)\\s*,\\s([0-9.-]+)\\s*\\)", "g");

(и теперь я понял, почему регулярные выражения являются более удобными)


Я всегда нахожу его полезно скопировать и пропустить выражение RegExp в консоли и посмотреть его вывод. Принимая ваше исходное выражение, получаем:

/(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g

, что означает, что выражения пытаются сопоставить /, s и g буквально, а parens () по-прежнему рассматриваются как специальные символы .


Обновление: .match() возвращает массив:

["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ]

, который, кажется, не очень полезен.

Вы должны использовать .exec() [MDN] для извлечения чисел:

["(25.774252, -80.190262)", "25.774252", "-80.190262"]

Это нужно вызывать до тех пор, пока все строки не будут обрабатывается.

Пример:

var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;
var result, points = [];

while((result = reg.exec(polygons)) !== null) {
    points.push([+result[1], +result[2]]);
}

Это создает массив массивов, а унарный плюс (+) преобразует строки в числа:

[
    [25.774252, -80.190262], 
    [18.466465, -66.118292], 
    ...
]

Конечно, если вы хотите, чтобы значения как строки, а не как числа, вы можете просто опустить +.

1
задан Z.Lin 18 March 2019 в 15:32
поделиться

1 ответ

Редактировать, чтобы объединить положения полос 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)

2nd plot

Оригинальный ответ

Похоже, вы выглядите для 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))

plot

0
ответ дан Z.Lin 18 March 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: