Сначала несколько терминов. Под «расслоением» искомый термин называется «группировка»: вы хотите отобразить один столбец с количеством счетчиков на a$family
и сгруппировать эти столбцы по a$order
. К счастью, этот кажущийся «продвинутый» сюжет довольно легко создать, если вы немного разберетесь с терминологией и использованием в ggplot2
. Я проведу вас через процесс, чтобы он был понятен.
Во-первых, основной график c. Вы используете geom_bar()
, но здесь вы должны использовать geom_col()
. Вы можете прочитать о причине почему в документации , но достаточно сказать, что если вы указываете только x aestheti c, вы используете geom_bar()
. Если вы указываете эстетику x и y, вы используете geom_col()
.
Для части grouping у вас есть два основных варианта: (1) использовать группировку и уклонение, или (2) использовать огранку. Оба работают нормально, и, честно говоря, это зависит от того, как вы хотите, чтобы результат выглядел. Я покажу и то, и другое.
Группировка и уклонение
Группировка довольно ясна. «Уклонение» означает, что ggplot
берет ваши группы и разделяет их, изменяя способ их отображения вдоль оси x. Подход состоит в использовании a$order
в качестве оси x и a$family
для группировки. Если мы просто построим это, вы получите график ниже:
ggplot(a, aes(x=order, y=counts)) + geom_col(color='black', alpha=0.2)
I've added an alpha=
value and colored the outline of the bars black so that we can see what's going on here: all the bars for a$family
are plotting on top of one another, since multiple a$family
bars share the same a$order
value. Your bars are therefore "grouped", but they are not separated out so we can see them. Doing this is what is known as "dodging": separating placement of geoms that share the same x value to avoid overplotting. We handle that placement using position=
. The problem is that ggplot2
still needs to be told on what column you want to perform the groups. For that, you need the group=
aesthetic:
ggplot(a, aes(x=order, y=counts, group=family)) +
geom_col(
position='dodge',
color='black', alpha=0.2)
Looks great, but you need to control a few things here. We need some way to identify the bars and also need to control the relative widths of each bar... we would like them to be the same size. That bar to the right is wider than all the rest and is ugly.
To fix the bar widths, you can use position=position_dodge2(preserve='single')
. Using position_dodge2()
is important here, because the related position_dodge()
would work, but not center along each x axis position.
To add labels, I'll use geom_text()
. Note a few things we do though, which is to "nudge" the values up a bit by adding some value to the y=
aesthetic. I also need to use the same position=
argument we used for the bars to apply to the text so that it dodges the same amount.
p
By the way, another good way to identify the families would be to use a different fill=
aesthetic applied to a$family
. I'm not going to show you that here though, since I would recommend doing a few other things with your data first (not for this question!).
Finally, we can make your vertical bars horizontal by adding coord_flip()
to our plot (which switches the axes):
p + coord_flip()
Faceting
The other way to group is to use facets. In this case, you plot a$family
as the x axis and then "separate" your groups using facet_wrap()
or facet_grid()
. Here, I'll use facet_grid()
.
ggplot(a, aes(x=family, y=counts)) +
geom_col(color='black', alpha=0.2) +
coord_flip() +
facet_grid(order ~ ., scales = 'free', space='free')
введите описание изображения здесь
Нам здесь не нужен какой-либо механизм маркировки, но я предпочитаю использовать здесь facet_grid
для конкретной c причины, по которой мы можем использовать аргумент space=
, что не является присутствует в facet_wrap()
. Без этого аргумента фасеты были бы равны по размеру, и результат очень похож на то, что мы имели в Группировании и Уклонении до использования position_dodge2(preserve='single')
. Аргумент scales=
необходим, потому что в противном случае у вас будут пробелы в каждом фасете для каждого a$family
- даже если ничего не существует.
Если вы хотите испортить размещение меток фасетов, вы используете switch=
внутри facet_grid()
(как узнать в документации). Чтобы изменить внешний вид этих ярлыков, вы используете theme()
элементы strip.*
.