Вопрос или проблема
Я пытаюсь изменить Джеффа Льюиса (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()
, необходимо правильно указать эстетические параметры для каждой из этих функций. Рассмотрим, как можно добиться желаемого результата на основе вашего примера.
В коде, который вы предоставили, есть несколько ключевых моментов, которые нужно учесть:
-
Указание цвета для
geom_line()
иgeom_point()
: Вы правильно привязываете цвет к переменнойColor
, но необходимо убедиться, что вы используете правильные эстетики вgeom_line()
иgeom_point()
. -
Добавление аннотаций: Когда вы добавляете аннотации, чтобы указать цвет текста, вы можете использовать те же данные цветовой палитры.
Ниже представлен исправленный код, который должен работать в соответствии с вашими ожиданиями:
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
Основные изменения и пояснения:
-
Убедитесь, что вы используете цветовую палитру на всех графических объектах. Для
geom_point()
вы добавилиcolor=Color
вaes()
, чтобы точки были окрашены в соответствии с вашим набором данныхColor
. -
Используйте
as.character()
для меток аннотаций. Это гарантирует, что аннотации отображаются правильно как текст. -
Сохраните согласованность данных. Вы привязываете значения
Color
для вашего основного набора данных и для аннотаций, что обеспечивает правильное отображение.
Теперь ваш график должен отображать линии и точки нужного цвета, а также текстовые аннотации в соответствии с вашими требованиями.