На самом деле это два вопроса в одном (не уверен, что это противоречит правилам SO, но в любом случае).
Первый вопрос: как заставить geom_text
вписаться в geom_bar
? (динамически в соответствии со значениями, нанесенными на график)
Оглядываясь вокруг, я обнаружил, что решения, которые я нашел, меняли размер этикетки. Это, безусловно, работает, но не во всех случаях. Вы можете изменить размер определенного графика, чтобы текст поместился в полосе, но при изменении данных вам может потребоваться снова вручную изменить размер текста. Моя реальная проблема заключается в том, что мне нужно создать один и тот же график для постоянно меняющихся данных (ежедневно), поэтому я не могу вручную настроить размер для каждого графика.
Я попытался установить размер метки в зависимости от данных. Это вроде как работает, не идеально, но работает во многих случаях.
Но вот еще одна проблема, даже когда метка умещается в полосе, изменение размера сюжета все портит. Заглянув в него, я также обнаружил в документации ggplot, что
метки имеют высоту и ширину, но они являются физическими единицами, а не единицами данных. Объем места, которое они занимают на этом графике, не является постоянным в единицах данных: при изменении размера графика метки остаются того же размера, но размер осей изменяется.
Это подводит меня ко второму вопросу: можно ли изменить это поведение по умолчанию и разрешить / изменить размер меток вместе с графиком?
А также позвольте мне уточнить свой первый вопрос. Можно ли заставить geom_text
вписаться в geom_bar
, динамически устанавливая размер текста, используя разумное соотношение между физическими единицами и единицами данных?
Итак, чтобы следовать хорошей практике, вот мой воспроизводимый пример:
set.seed(1234567)
data_gd <- data.frame(x = letters[1:5],
y = runif(5, 100, 99999))
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = "identity") +
geom_text(mapping = aes(label = y, y = y/2))
Этот код создает такой график:
Если я просто изменю размер графика, метки останутся того же размера, но размер осей изменится ", благодаря чему метки помещаются в полосы (теперь, возможно, метки даже слишком малы).
Итак, это мой второй вопрос. Было бы неплохо, если бы метки также изменили размер и сохранили соотношение сторон по отношению к полосам. Есть идеи, как это сделать или возможно ли это вообще?
Хорошо, но возвращаясь к тому, как разместить метки внутри полос, самое простое решение - установить размер меток.
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = "identity") +
geom_text(mapping = aes(label = y, y = y/2), size = 3)
Опять же, это работает, как показано ниже, но не поддерживает / не устойчиво к изменениям данных.
Например, один и тот же код для создания графика с разными данными дает катастрофические результаты.
data_gd <- data.frame(x = letters[1:30],
y = runif(30, 100, 99999))
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = "identity") +
geom_text(mapping = aes(label = y, y = y/2), size = 3)
И я могу продолжить с примерами, установив размер меток в зависимости от количества категорий по оси x и так далее. Но вы уловили суть, и, возможно, один из вас ggplot2
экспертов может подсказать мне идеи.