#r #function #histogram
#r #функция #гистограмма
Вопрос:
Я пытаюсь создать эту стратифицированную гистограмму на R, однако я не получаю правильный график. Я хотел бы также использовать функцию rect, если это возможно.
Как бы я написал функцию R для создания этой стратифицированной гистограммы с использованием набора данных iris в R?
Это код на данный момент:
strathist = function(x, y, ylab = "Frequency", xlab = "", main = ""){
cols = hcl(h=seq(0, 360, by = 120))
h = hist(x, breaks = 24, plot = FALSE)
tb = table(y, cut(x, h$breaks))
plot.new()
barplot(tb, ylim = c(0, max(h$count)), col = cols,
ylab = ylab, xlab = xlab, main = main, axisnames = FALSE)
box()
axis(1, 0:(length(h$breaks)-1), h$breaks)
axis(2)
legend("topright", c(rownames(tb)), fill = cols)
}
with(iris, strathist(Sepal.Width, Species, xlab = "Sepal.Width", main = "Stratified Histogram"))
Комментарии:
1. Привет, Бенжамен. В чем ваша ошибка? Является ли изображение, которое вы опубликовали, тем, которого вы хотите достичь, или это график, который вы создали? Если да, то что, по-вашему, в этом плохого? Не могли бы вы отредактировать свой вопрос, чтобы предоставить более подробную информацию, включая код, который вы использовали, который выдает ошибку.
2. Пожалуйста, не вандализируйте свои собственные сообщения. Публикуя здесь, вы предоставляете SO право распространять контент в соответствии с CC-by SA 4.0. Любой вандализм будет отменен. Если вы хотите удалить свой вопрос, есть ссылка «удалить» прямо под текстом вопроса.
Ответ №1:
Есть несколько различных способов сделать это, если вы настаиваете на использовании R base, вы могли бы использовать две гистограммы, одну для добавления цветов, а другую для добавления полей:
strathist = function(x,
y,
ylab = "Frequency",
xlab = "",
main = "") {
cols = hcl(h = seq(0, 360, by = 120))
h = hist(x,
breaks = 24,
plot = F)
tb = table(y, cut(x, h$breaks))
ylim <- c(-.05 * max(colSums(tb)),
1.25 * max(colSums(tb)))
barplot(
tb,
col = cols,
ylim = ylim,
ylab = ylab,
xlab = xlab,
main = main,
axisnames = FALSE,
border = NA,
space = 0
)
barplot(
colSums(tb),
ylim = ylim,
col = NA,
ylab = ylab,
xlab = xlab,
main = main,
axisnames = FALSE,
add = T,
space = 0
)
box()
axis(1, seq(0,
length(h$breaks) - 1,
by = 5),
seq(min(x),max(x), by = .5))
axis(2)
legend("topright", c(rownames(tb)), fill = cols,border = NA,)
}
with(
iris,
strathist(Sepal.Width, Species, xlab = "Sepal.Width", main = "Stratified Histogram")
)
Или вы могли бы пойти несколько более простым путем ggplot2
:
library(ggplot2)
ggplot(iris,aes(x = Sepal.Width))
geom_histogram(bins = 25,aes(fill = Species))
geom_histogram(bins = 25, fill = NA, color = 'black')
theme_minimal()
Создано 2020-09-13 пакетом reprex (версия 0.3.0)
Комментарии:
1. Да, но единственный способ, который я могу придумать, — это затем добавить цвета, используя
polygon
что может немного раздражать.2. Да, это возможно, поскольку это всего лишь оболочка для polygon, но вам все равно нужно отсортировать координаты, что, безусловно, возможно, но немного сложно.