Как указать цвет с помощью geom_line, geom_point и annotate в ggplot2?

Вопрос или проблема

Я пытаюсь изменить Джеффа Льюиса (2023-10-23) Поляризация в Конгрессе, и я не могу контролировать цвет в geom_line и geom_point.

Следующее, похоже, является ближайшим к тому, что я хочу, с подмножеством из 12 из его 2774 точек:

library(ggplot2)
PolarDatSmpl <- data.frame(
  year=rep(c(1879, 1951, 2023), 4), 
  chamber=rep(c('House', 'Senate'), e=3, len=12), 
  party=rep(c('DEM', 'REP'), e=6), 
  value=c(-.39, -.26, -.38, -.45, -.20, -.35, 
           .40,  .28,  .51,  .30,  .28,  .55) )

PolarDatSmpl$pc <- with(PolarDatSmpl, 
    interaction(party, chamber))
  
# Я хочу, чтобы линии и точки были обозначены цветами 
# и текстом 

PolarColors <- data.frame(
  chamber=rep(c('House', 'Senate'), e=2), 
  party=rep(c('DEM', 'REP'), 2), 
  Color=c('blue', 'red', 'darkblue', 'darkred'), 
  yearTxt=c(1960.3, 1944.3, 1961, 1945),  
  yearPch=c(1944.3, 1927.8, 1944, 1928), 
  value=c(-.4, .5, -.33, .4) )

#value=c(-.5, .4, -.43, .35) )
#c(.5, .4, -.43, -.35) 
PolarColors$pc <- with(PolarColors, 
    interaction(party, chamber))
rownames(PolorColors) <- PolarColors$pc

PolarDatSmpl$Color <- PolarColors[
  PolarDatSmpl$pc, 'Color']

p1 <- ggplot(data=PolarDatSmpl, 
    aes(x=year, y=value, group=pc, color=Color)) +
  theme_bw() + 
  theme(legend.position='none') + 
  geom_line() + geom_point(mapping=aes(
    shape=factor(chamber) )) 

# Что мне нужно сделать, чтобы получить желаемые цвета? 

p2 <- p1 + with(PolarColors, annotate('text', 
    x=yearTxt, y=value, label=pc, color=Color)) + 
  geom_point(PolarColors, mapping = aes( 
    x=yearPch, y=value, shape=factor(chamber) ))
p2

Это дает мне все, что я хочу, за исключением цвета точек и линий. Я могу указать цвет с помощью annotate и сопутствующего вызова geom_plot, чтобы поместить легенду туда, где я хочу, но мне не удалось контролировать цвет линии. (Однажды я смог закрасить точки и линии, но это сломалось, когда я добавил аннотацию.)

Предложения? Спасибо, Спенсер Грейвс

Ответ или решение

Чтобы изменить цвета линий и точек в ggplot2 с использованием функций geom_line(), geom_point() и annotate(), необходимо правильно указать эстетические параметры для каждой из этих функций. Рассмотрим, как можно добиться желаемого результата на основе вашего примера.

В коде, который вы предоставили, есть несколько ключевых моментов, которые нужно учесть:

  1. Указание цвета для geom_line() и geom_point(): Вы правильно привязываете цвет к переменной Color, но необходимо убедиться, что вы используете правильные эстетики в geom_line() и geom_point().

  2. Добавление аннотаций: Когда вы добавляете аннотации, чтобы указать цвет текста, вы можете использовать те же данные цветовой палитры.

Ниже представлен исправленный код, который должен работать в соответствии с вашими ожиданиями:

library(ggplot2)

# Данные
PolarDatSmpl <- data.frame(
  year=rep(c(1879, 1951, 2023), each=4),
  chamber=rep(c('House', 'Senate'), times=6),
  party=rep(c('DEM', 'REP'), each=6),
  value=c(-.39, -.26, -.38, -.45, -.20, -.35, 
          .40,  .28,  .51,  .30,  .28,  .55)
)

# Классификация для цвета
PolarDatSmpl$pc <- with(PolarDatSmpl,
    interaction(party, chamber))

# Цветовая палитра
PolarColors <- data.frame(
  chamber=rep(c('House', 'Senate'), each=2),
  party=rep(c('DEM', 'REP'), 2),
  Color=c('blue', 'red', 'darkblue', 'darkred'),
  yearTxt=c(1960.3, 1944.3, 1961, 1945),
  yearPch=c(1944.3, 1927.8, 1944, 1928),
  value=c(-.4, .5, -.33, .4)
)

PolarColors$pc <- with(PolarColors, 
    interaction(party, chamber))

# Присваивание цвета
PolarDatSmpl$Color <- PolarColors[as.character(PolarDatSmpl$pc), 'Color']

# Построение графика
p1 <- ggplot(data=PolarDatSmpl, 
             aes(x=year, y=value, group=pc, color=Color)) +
  theme_bw() + 
  theme(legend.position='none') + 
  geom_line() + 
  geom_point(aes(shape=factor(chamber), color=Color)) # цвет для точек

# Добавление аннотаций
p2 <- p1 + 
  with(PolarColors, annotate('text', 
                              x=yearTxt, y=value, 
                              label=as.character(pc), 
                              color=Color)) + 
  geom_point(data=PolarColors, aes(x=yearPch, y=value, shape=factor(chamber), color=Color))

# Отображение графика
p2

Основные изменения и пояснения:

  1. Убедитесь, что вы используете цветовую палитру на всех графических объектах. Для geom_point() вы добавили color=Color в aes(), чтобы точки были окрашены в соответствии с вашим набором данных Color.

  2. Используйте as.character() для меток аннотаций. Это гарантирует, что аннотации отображаются правильно как текст.

  3. Сохраните согласованность данных. Вы привязываете значения Color для вашего основного набора данных и для аннотаций, что обеспечивает правильное отображение.

Теперь ваш график должен отображать линии и точки нужного цвета, а также текстовые аннотации в соответствии с вашими требованиями.

Оцените материал
Добавить комментарий

Капча загружается...