Как исправить ошибку длины aestheti c при создании коробочных графиков - PullRequest
0 голосов
/ 20 апреля 2020

Я делаю блокпост из нижеприведенного df (извините, если это неправильный способ публикации фрейма данных. Я просто скопировал и вставил вывод из функции dput). Я использовал этот код для создания коробочного графика:

IPC_15 <- tidyr::pivot_longer(Income_percap_15, -c("State", "Counties"), names_to = "Income_Per_Capita", values_to = "num") %>% 
  ggplot(aes(x="", y = Income_percap_15)) + 


geom_boxplot() + coord_cartesian(ylim = c(0, 52))
IPC_15 + labs(x = "State",
                y = "Income per Capita",
                title = "US Income per capita per state")

Однако я продолжаю получать сообщение об ошибке «Эстетика должна быть либо длины 1, либо такой же, как данные (52): y».

Есть идеи, как это исправить?

структура (список (штат = структура (1:52, .Label = c ("Алабама", "Аляска", "Аризона", "Арканзас", "Калифорния", "Колорадо", "Коннектикут", "Делавэр", "Округ Колумбия", "Флорида", "Джорджия", "Гавайи", "Айдахо", "Иллинойс", "Индиана", "Айова", "Канзас", "Кентукки", "Луизиана", "Мэн", "Мэриленд", "Массачусетс", "Мичиган", "Миннесота", "Миссисипи", "Миссури", "Монтана", "Небраска" "," Невада "," Нью-Гемпшир "," Нью-Джерси "," Нью-Мексико "," Нью-Йорк "," Северная Каролина "," Северная Дакота "," Огайо "," Оклахома "," Орегон "," Пенсильвания "," Пуэрто-Рико "," Род-Айленд "," Южная Каролина "," Южная Дакота "," Теннесси "," Техас "," Юта "," Вермонт "," Вирджиния "," Вашингтон "," Западная Вирджиния " , "Висконсин", "Вайоминг"), класс = "фактор"), графства = c (67L, 29L, 15L, 75L, 58L, 64L, 8L, 3L, 1L, 67L, 159L, 5L, 44L, 102L , 92л, 99л, 105л, 120л, 64л, 16л, 24л, 14л, 83л, 87л, 82л, 82л, 115л, 56л, 93л, 17л, 10л, 21л, 62л, 100л, 53л, 88л, 77л, 36л, 67л L, 78L, 5L, 46L, 66L, 95L, 254L, 29L, 14L, 133L, 39L, 55L, 72L, 23L), Income_15 = c (20780.9402985075, 30332.9655172414, 21052.5333333333, 20072.0266666667, 27752525257, 279025255757, 2790225287, 2790225287, 279022525767, 28902, 2890, 2530, 281, 28, 2825, 2890, 2825, 2525, 2890 , 47675, 23501,8507462687, +20566,0062893082, 31892,6, +21451,1136363636, 25485,7156862745, +23977,0652173913, +26555,8686868687, +24953,0476190476, +20663,6083333333, +22064,609375, 25792,3125, +33073,2083333333, +35554,4285714286, +23662,2048192771, +27610,4252873563, +18805,0487804878, +21504,7826086957, +25020,6785714286, +26336,8494623656, 26317,7058823529, 31810,4, +36084,5238095238, +21789,4545454545, +28189,7580645161 , 22514,36, +31900,5094339623, +24467,7727272727, 22811,8701298701, 24311,9166666667, +25952,223880597, +9617,66666666667, 35670,6, +21411,9565217391, 25334,8939393939, 21442,4210526316, 23551,7992125984, +22552,2413793103, 28487,2142857143, +27065,3909774436, +25734,4102564103, +21710,4181818182, +26250,7222222222, 29223,652173913)), row.names = c (Н.А. , -52L), класс = "data.frame")

1 Ответ

1 голос
/ 20 апреля 2020

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

Текст и значение сообщения об ошибке

Ваше сообщение об ошибке "Эстетика должна быть либо длины 1, либо такой же, как данные (52): y "означает, что один из атрибутов aes() не соответствует всем точкам в вашем наборе данных. Описание в конце дает вам число, которое «должно» быть (52) на основе того, что было найдено при картировании одной из эстетик или # наблюдений в вашем наборе данных. У вас есть 52 строки в вашем фрейме данных, что означает, что одна из этих эстетик не отображается правильно. Вы можете использовать "" для отображения эстетики c, что в основном означает «отобразить весь фрейм данных как один». Похоже ошибка именно с y=Income_percap_15. После вашего звонка pivot_longer столбец с таким именем отсутствует. Я думаю, что вы хотите использовать y=num там.

Предполагаемая эстетика и ваш предполагаемый сюжет

В вашем коде есть эстетика, указанная для x="" и y="Income_percap_15", что будет означать, что вы хотите показать один boxplot для всего набора данных . Тем не менее, ваш labs() вызов указывает вам wi sh, чтобы показать коробку для каждого штата. Хотя вы можете показать «один блокпост» для всего набора данных »(aes(x="",...)), ваши данные не смогут показать вам блокпост для каждого состояния . Блокпост представляет распределение данных, поэтому это означает, что вам нужно несколько точек "y" для каждого значения "x". В вашем фрейме данных у вас есть только одно значение "y" (доход на душу населения) для каждого "x" (штат).

Тип проблемы c пределы

Установленные вами ограничения (от 0 до 52) применяются к y эстетике c. Похоже, что y эстетика c предназначена для сопоставления с Доход на душу населения. В вашем информационном кадре после вызова pivot_longer это будет столбец «num», который имеет минимальное значение 9618 и максимальное значение 47675, что явно выходит за пределы установленного вами предела. Это означает, что см. пустой график. Если вы хотите, чтобы это применялось к x aestheti c (52 штата), которое, как я считаю, является вашим намерением, здесь не нужно - вам нужно только указать правильный эстет c. применить этот лимит к тебе xis ... Я предполагаю, что вы хотите иметь горизонтально расположенные боксы. Для этого вы «переворачиваете» ось, которая будет coord_flip().

Окончательный сюжет?

Ну, у меня с sh У меня получше новость, но, как уже упоминалось выше, ваш предполагаемый бокс-лист не представляется возможным с вашими данными. Чтобы «исправить» ваш код, чтобы показать вам блокпост (хотя это будет невозможно), здесь он ниже. Обратите внимание, что результирующий «блокпост» показывает строки для каждого состояния, потому что для каждого состояния n = 1. Следовательно, «распространение» не является распространением. Примечание: предположим, что df - это ваш фрейм данных после вызова pivot_longer :

ggplot(data=df, aes(x=State, y = num)) +
    geom_boxplot() +
    coord_flip() +
    labs(y='Income per capita', title="US Income per capita per state") +
    theme(
        axis.text.y=element_text(size=7, vjust=0.3),
        plot.title=element_text(size=9)
    )

enter image description here

На самом деле не так уж и плохо показывать здесь «линии» вместо «прямоугольника», но вы, конечно, можете сделать тот же график и использовать geom_point или даже geom_segment, чтобы придать вам «линию», хотя чище. Некоторые другие замечания о графике:

  • theme() применяется к оси Y, тогда как labs() применяется к обратной оси, как кажется. Coord_flip () означает, что ваша эстетика надписывания применяется к обратной оси, но тема обычно устанавливается вне вызова ord_cartesian.

  • Specifi c другие элементы темы, чтобы она выглядела подходящий

  • Когда вы сохраняете или просматриваете, так как ваш график "длинный", вы должны использовать или сохранять в формате, который поддерживает это, или ваши значения оси Y будут появляться " сплющенные». Я думаю, что соотношение сторон ширина / высота здесь было 1: 2.

  • vjust in theme() предназначен для регулировки вертикального расположения надписей на оси «State» относительно текста. По умолчанию метки расположены вертикально по центру с текстом ... но когда у вас есть заглавные и строчные буквы, вертикальный центр на самом деле слишком велик, в зависимости от того, как мы хотим, чтобы он выглядел. Это немного подталкивает все метки, чтобы исправить эффект , который выглядит нецентрированным , даже если метки фактически центрированы вертикально.

...