Как сделать гистограмму в R с независимыми значениями оси X

(Первый пользователь R) Итак, я пытаюсь сделать перекрывающиеся графики гистограмм с разными диапазонами для значений оси X, которые я могу легко воспроизвести из файла Excel. Я чувствую, что я на правильном пути, потому что он строит обе гистограммы и делает ось x на 3. Кажется, я не могу понять, как заставить ось (3) принимать xlim=, который я хочу. Ниже приведен код, который я использую, и изображение

## Open Xl Data into R
library(readxl)
dataset <- read_excel("location holder")
View(dataset)
## DLS subsets
Zone_1_DLS <- subset(dataset$DLS, dataset$Zone==1)
Zone_2_DLS <- subset(dataset$DLS, dataset$Zone==2)
Zone_3_DLS <- subset(dataset$DLS, dataset$Zone==3)
## ROP Subsets
Zone_1_ROP <- subset(dataset$DAVG_ROP, dataset$Zone==1)
Zone_2_ROP <- subset(dataset$DAVG_ROP, dataset$Zone==2)
Zone_3_ROP <- subset(dataset$DAVG_ROP, dataset$Zone==3)
## DLS Histograms
DLS1 <- hist(Zone_1_DLS)
DLS2 <- hist(Zone_2_DLS)
DLS3 <- hist(Zone_3_DLS)
## ROP Histograms
ROP1 <- hist(Zone_1_ROP)
ROP2 <- hist(Zone_2_ROP)
ROP3 <- hist(Zone_3_ROP)
## Plot Zone 1 Histograms
plot( ROP1, col=rgb(1,0,0,1), xlim=c(0,300), ylim = c(0,500))
plot( DLS1, axis(3),col=rgb(0,0,1,1), xlim=c(0,10), add = T)
axis(3,xlim=c(0,10))

Изображение


person Drivric    schedule 02.03.2017    source источник
comment
Вы можете загрузить свой набор данных с помощью dput()?   -  person tbradley    schedule 03.03.2017
comment
@tbradley too big t paste, вот ссылка на onedrive ‹iframe src=onedrive.live.com/ width=98 height=120 frameborder=0 scrolling=no›‹/iframe›   -  person Drivric    schedule 03.03.2017
comment
Вам потребуется некоторое время, чтобы создать минимальный рабочий пример, как показано здесь: воспроизводимый пример   -  person tbradley    schedule 03.03.2017
comment
кроме того, xlim не является допустимым аргументом для функции axis. Вы должны попробовать axis(3, at = c(1:10)) вместо этого   -  person tbradley    schedule 03.03.2017
comment
@tbradley Я сделал пример кода, чтобы посмотреть, может ли это помочь объяснить мою проблему, set.seed(42) p1 <- hist(rnorm(500,4)) p2 <- hist(rnorm(500,150)) plot( p1, col=rgb(0,0,1,1/4),xlim=c(0,200)) plot( p2, col=rgb(1,0,0,1/4), add=T) однако диапазон p1 ограничен (0-10), где p2 не имеет обязательно определяемого предела. Поэтому каждый раз, когда я xlim=c(0,10), я отсекаю все свои данные p2, тогда как, когда они нанесены на график выше, все данные p1 непригодны для использования из-за того, что они составляют всего 0-10 по шкале x, которая может быть 0-200.   -  person Drivric    schedule 10.03.2017
comment
Они существуют в соотношении 1 к 1, для каждого наблюдения p2 (где значение может быть 0-200) есть наблюдение в p1, где значения могут быть только (0-10). Итак, я думаю, мой вопрос заключается в том, могу ли я постройте их на разных осях (1, 3), но с одинаковой длиной оси, чтобы они отображались на одном графике.   -  person Drivric    schedule 10.03.2017


Ответы (1)


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

Здесь используются значения rnorm(), которые вы разместили в комментариях:

set.seed(42) 
p1 <- data.frame(x = rnorm(500,4)) 
p2 <- data.frame(x = rnorm(500,150)) 

p1$cat <- "a"
p2$cat <- "b"


p <- rbind(p1, p2)
p$zone <- c(rep(c(1, 2), 500))


library(ggplot2)
ggplot(p, aes(x = x))+
  facet_grid(zone~cat, scales = "free")+
  geom_histogram(bins = 30)

и это даст вам этот график (где a и b представляют ваши типы значений DLS и DAVG_ROP соответственно, а 1 и 2 представляют разные зоны): несколько гистограмм с независимой осью X

В качестве примечания, у вас будет 3 строки на выходе графика, поскольку у вас есть 3 зоны.

Что касается ваших данных, это должно работать, чтобы воспроизвести что-то похожее на пример (я не могу быть на 100% уверенным, так как мне не удалось проверить это на ваших данных, но я достаточно уверен). Я рекомендую сохранить все это как один набор данных, как у вас было изначально, и просто немного реорганизовать.

library(dplyr)
library(ggplot2)
df1 <- dataset %>%
  select(DLS, Zone) %>%
  mutate(x = DLS, cat = "DLS") %>%
  select(x, Zone, cat)

df2 <- dataset %>%
  select(DAVG_ROP, Zone) %>%
  mutate(x = DAVG_ROP, cat = "DAVG_ROP")%>%
  select(x, Zone, cat)

df <- rbind(df1, df2)

ggplot(df, aes(x = x))+
  facet_grid(Zone~cat, scales = "free")+
  geom_histogram()

Там может быть более эффективный/краткий способ сделать уборку посередине, но это тоже работает.

person tbradley    schedule 10.03.2017