Как обернуть текст в ggplot?

Что касается задачи TidyTuesday прошлой недели, я знаю, что немного опоздал, чтобы спросить об этом, я пытаюсь отобразить цены на акции компаний BigTech на фасетном графике. Тем не менее, некоторые названия компаний длиннее, чем другие, и я хотел бы обернуть текст для этих конкретных названий компаний. Вот чего я достиг до сих пор:

library(tidyverse)
library(showtext)
library(patchwork)
library(janitor)
library(glue)
library(ggtext)
library(gghighlight)
library(lubridate)


font_add_google("Archivo", family = "title")
font_add_google("Nunito", family = "subtitle")
font_add_google("Martel", family = "axis")
font_add_google("Spartan", family = "caption")

font_add('fa-reg', 'fonts/Font Awesome 6 Free-Regular-400.otf')
font_add('fa-brands', 'fonts/Font Awesome 6 Brands-Regular-400.otf')
font_add('fa-solid', 'fonts/Font Awesome 6 Free-Solid-900.otf')

showtext_auto()
dat <- tidytuesdayR::tt_load(2023, week = 6)

big_tech_stock_prices <- dat$big_tech_stock_prices
big_tech_company_name <- dat$big_tech_companies


big_tech_stock_prices <- big_tech_stock_prices %>%
  left_join(big_tech_company_name, by = "stock_symbol") %>%
  mutate(company = case_when(company == "International Business Machines Corporation" ~ "IBM",
                             TRUE ~ company))


plot <- ggplot(big_tech_stock_prices, aes(x = date, y = close, group = company)) +
  geom_line() +
  gghighlight(company %in% c("Apple Inc.", "Adobe Inc.", "Amazon.com, Inc.", "Salesforce, Inc.", "Cisco Systems, Inc.",
                             "Alphabet Inc.", "IBM", "Intel Corporation", "Meta Platforms, Inc.", "Microsoft Corporation",
                             "Netflix, Inc.", "NVIDIA Corporation", "Oracle Corporation", "Tesla, Inc."),
              use_direct_label = FALSE,
              unhighlighted_params = list(linewidth = 0.1, colour = alpha("grey20", 0.3))) +
  geom_area(aes(date, close, colour = stock_symbol, fill = stock_symbol), big_tech_stock_prices, alpha = 0.2, size = 0.5) +
  geom_text(
            aes(x = lubridate::ymd("2014-01-01"), y = 500, label = company, color = company), size = 30) +
  facet_wrap(~company) +
  theme_minimal() +
  labs(title = "Stock Market Values for BigTech Companies (2010-2022)",
       subtitle = "The plot demonstrates the stock market value for 14 BigTech companies. Note that the values<br>displays the closed prices for each days",
       y = "US Dollar - $",
       x = "") +
  theme(legend.position = "none",
        strip.background = element_blank(),
        strip.text = element_blank(),
        axis.title.y = element_markdown(family = "axis", size = 55, linewidth = 0.2),
        axis.title.x = element_markdown(family = "axis", size = 55, linewidth = 0.2),
        axis.text.y = element_markdown(family = "axis", size = 35),
        axis.text.x = element_markdown(family = "axis", hjust = 0.43, size = 35),
        plot.title = element_markdown(family = "title", size = 95, hjust = 0.5, lineheight = 0.15, linewidth = 0.1),
        plot.subtitle = element_markdown(family = "subtitle", size = 75, hjust = 0.5, lineheight = 0.15, linewidth = 0.1),
        plot.caption = element_markdown(family = "title", size = 45, lineheight = 0.15, linewidth = 0.1, hjust = 0.5),
        plot.background = element_rect(fill = "white", color = "white"))


ggsave("deneme.png", height = 6,  width = 7.5, dpi = 720)
  

Который создал этот сюжет

Итак, как видно из сюжета, Cisco Systems и Intel имеют большую длину по сравнению с Adobe и Apple и поэтому хотелось бы обернуть текст. Мой вопрос, как я могу это сделать?

Ссылка на: stackoverflow.com/questions/47446259/…

Freakazoid 20.02.2023 15:17

Один простой вариант - заменить пробелы \n для создания разрывов. В противном случае: stackoverflow.com/questions/25106508/…

tjebo 20.02.2023 15:58

В другой отличной ветке есть ссылки на несколько хороших решений очень похожих проблем: stackoverflow.com/questions/65956833/…

tjebo 20.02.2023 16:08

Я попытался заменить пробелы новыми строками, как было предложено в этой теме, однако это просто не сработало, потому что на этот раз проблема заключалась в том, что метки не отображались по какой-то причине, которую я не мог понять.

mzkrc 21.02.2023 09:10

Не беспокойтесь, я только что нашел решение этой проблемы, изменив функцию geom_text.

mzkrc 21.02.2023 09:43
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
1
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать str_wrap (через stringr), чтобы задать ширину текста stringr.tidyverse.org/reference/str_wrap.html ИЛИ...

Вы можете заменить пробелы в названиях компаний новыми строками перед построением графика, как я сделал здесь:

big_tech_stock_prices$company2 <- gsub(' ', ' \n',big_tech_stock_prices$company)

plot <- ggplot(big_tech_stock_prices, aes(x = date, y = close)) +geom_line(aes(x = date, y = close, color=company)) + gghighlight(company %in% c("Apple Inc.", "Adobe Inc.", "Amazon.com, Inc.", "Salesforce, Inc.", "Cisco Systems, Inc.",  "Alphabet Inc.", "IBM", "Intel Corporation", "Meta Platforms, Inc.", "Microsoft Corporation",  "Netflix, Inc.", "NVIDIA Corporation", "Oracle Corporation", "Tesla, Inc."),   use_direct_label = FALSE,   unhighlighted_params = list(linewidth = 0.2, colour = "gray50" , aes(color=company2))) + geom_area(aes(date, close, colour = stock_symbol, fill = stock_symbol), big_tech_stock_prices, alpha = 0.2, size = 0.5) + geom_text(  aes(x = lubridate::ymd("2014-01-01"), y = 400, label = company2, color = company2), size = 4) +  facet_wrap(~company) + theme_minimal()+ labs(title = "Stock Market Values for BigTech Companies (2010-2022)",    subtitle = "The plot demonstrates the stock market value for 14 BigTech companies. Note that the values<br>displays the closed prices for each days", y = "US Dollar - $", x = "") + theme(legend.position = "none", strip.background = element_blank(),strip.text = element_blank(), axis.title.y = element_markdown(family = "axis", size = 11, linewidth = 0.2),  axis.title.x = element_markdown(family = "axis", size = 11, linewidth = 0.2), axis.text.y = element_markdown(family = "axis", size = 10),axis.text.x = element_markdown(family = "axis", hjust = 0.43, size = 10),  plot.title = element_markdown(family = "title", size = 12, hjust = 0.5, lineheight = 0.15, linewidth = 0.1),   plot.subtitle = element_markdown(family = "subtitle", size = 11, hjust = 0.5, lineheight = 0.15, linewidth = 0.1),  plot.caption = element_markdown(family = "title", size = 11, lineheight = 0.15, linewidth = 0.1, hjust = 0.5),  plot.background = element_rect(fill = "white", color = "white")) + theme(plot.margin=unit(c(1,1,1,1),"cm"))

Когда я добавляю первый код для замены пробелов новыми строками, метки, которые должны были отображаться на графике как названия компаний, не существуют. Я не мог понять, в чем проблема. PS. Я хотел добавить скриншот, но он не позволяет мне это сделать. Можете ли вы подтвердить эту проблему, поскольку я уже предоставил код, который у меня есть?

mzkrc 21.02.2023 08:01

Не беспокойтесь, я только что нашел решение этой проблемы, изменив функцию geom_text.

mzkrc 21.02.2023 09:44

Мне пришлось немного изменить ваш код, чтобы заставить это работать, но основная проблема заключалась в том, что если вы измените столбец «компания», добавив фрейм данных пробелов, вам также необходимо обновить другие ссылки на этот столбец на вашем рисунке (например, gghighlight по-прежнему ссылался на c("Apple Inc") с пробелом, а не на "\n"). Таким образом, вам нужно либо дать новому столбцу новое имя для geom_text ("company2"), либо использовать новый формат в gghighlight (например, "Apple\nInc"), который вы можете извлечь с помощью for_plot <- unique(big_tech_stock_prices$company) а затем используйте gghighlight(company%in%c(for_plot),...

alexandradevon 21.02.2023 16:23

Другие вопросы по теме