programing

ggplot2에서 facet_sigma 및 척도 = "자유"로 개별 축 한계 설정

muds 2023. 7. 15. 10:40
반응형

ggplot2에서 facet_sigma 및 척도 = "자유"로 개별 축 한계 설정

예측 값 대 잔차 그림과 함께 예측 값 대 실제 값을 나란히 보기 위해 패싯된 그림을 만들고 있습니다.사용할 것입니다.shiny다양한 교육 매개 변수를 사용하여 모델링 작업의 결과를 탐색하는 데 도움이 됩니다.저는 85%의 데이터로 모델을 교육하고, 나머지 15%에 대해 테스트를 수행한 후 매번 실제/예측 값을 수집하여 이를 5회 반복합니다.잔차를 계산한 후, 나의data.frame다음과 같이 표시됩니다.

head(results)
       act     pred       resid
2 52.81000 52.86750 -0.05750133
3 44.46000 42.76825  1.69175252
4 54.58667 49.00482  5.58184181
5 36.23333 35.52386  0.70947731
6 53.22667 48.79429  4.43237981
7 41.72333 41.57504  0.14829173

내가 원하는 것:

  • 다음의 나란히 그림pred대.act그리고.pred대.resid
  • 다음에 대한 x/y 범위/한계pred대.act이상적으로 동일한, 이상적으로 부터.min(min(results$act), min(results$pred))로.max(max(results$act), max(results$pred))
  • 다음에 대한 x/y 범위/한계pred대.resid 실제 그림과 예측 그림에 대해 수행하는 작업에 영향을 받지 않습니다.다음에 대한 플롯x예측된 값에만 적용됩니다.y잔류 범위만 문제가 없습니다.

두 그림을 나란히 보기 위해 데이터를 녹입니다.

library(reshape2)
plot <- melt(results, id.vars = "pred")

이제 플롯:

library(ggplot2)
p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free")

print(p)

그것은 제가 원하는 것에 상당히 가깝습니다.

enter image description here

실제 범위와 예측된 범위가 동일한 경우 x와 y 범위를 원하는 것입니다. 하지만 이를 어떻게 지정해야 할지 잘 모르겠습니다. 예측된 범위와 잔차 그림이 완전히 다르기 때문에 이 작업을 수행할 필요가 없습니다.

저는 두 가지 모두에 대해 이런 것도.scale_x_continous그리고.scale_y_continuous:

min_xy <- min(min(plot$pred), min(plot$value))
max_xy <- max(max(plot$pred), max(plot$value))

p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free")
p <- p + scale_x_continuous(limits = c(min_xy, max_xy))
p <- p + scale_y_continuous(limits = c(min_xy, max_xy))

print(p)

하지만 그것은 그것을 선택합니다.min()값을 입력합니다.

enter image description here

제가 생각한 마지막 아이디어는 최소의 가치를 저장하는 것입니다.act그리고.pred변수를 녹이기 전에 해당 변수를 녹인 데이터 프레임에 추가하여 해당 변수가 나타나는 면을 지정합니다.

head(results)
       act     pred       resid
2 52.81000 52.86750 -0.05750133
3 44.46000 42.76825  1.69175252
4 54.58667 49.00482  5.58184181
5 36.23333 35.52386  0.70947731

min_xy <- min(min(results$act), min(results$pred))
max_xy <- max(max(results$act), max(results$pred))

plot <- melt(results, id.vars = "pred")

plot <- rbind(plot, data.frame(pred = c(min_xy, max_xy),
  variable = c("act", "act"), value = c(max_xy, min_xy)))

p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free")

print(p)

포인트가 표시되는 것을 제외하고는 제가 원하는 것을 수행합니다.

enter image description here

이런 일을 할 수 있는 제안이 있습니까?


나는 이 아이디어를 추가하려고 보았습니다.geom_blank()하지만 어떻게 특정해야 할지 잘 모르겠습니다.aes()물어뜯고 제대로 작동하게 하거나, 뭐가.geom_point()의 히스토그램 사용과 동일합니다.aes(y = max(..count..)).


다음은 사용할 데이터입니다(용해 전 실제 값, 예측 값 및 잔여 값).

results <- read.table(header = TRUE, text = "
act              pred             resid
52.81            52.8675013282404 -0.0575013282403773
44.46            42.7682474758679 1.69175252413213
54.5866666666667 49.0048248585123 5.58184180815435
36.2333333333333 35.5238560262515 0.709477307081826
53.2266666666667 48.7942868566949 4.43237980997177
41.7233333333333 41.5750416040131 0.148291729320228
35.2966666666667 33.9548164913007 1.34185017536599
30.6833333333333 29.9787449128663 0.704588420467079
39.25            37.6443975781139 1.60560242188613
35.8866666666667 36.7196211666685 -0.832954500001826
25.1             27.6043278172077 -2.50432781720766
29.0466666666667 27.0615724310721 1.98509423559461
23.2766666666667 31.2073056885252 -7.93063902185855
56.3866666666667 55.0886903524179 1.29797631424874
42.92            43.0895814712768 -0.169581471276786
41.57            43.0895814712768 -1.51958147127679
27.92            32.3549865881578 -4.43498658815778
23.16            26.2428426737583 -3.08284267375831
38.0166666666667 36.6926037128343 1.32406295383237
61.8966666666667 56.7987490221996 5.09791764446704
37.41            45.0370788180147 -7.62707881801468
41.6333333333333 41.8231642271826 -0.189830893849219
35.9466666666667 38.3297859332601 -2.38311926659339
48.9933333333333 49.5343916620086 -0.541058328675241
30.5666666666667 30.8535641206809 -0.286897454014273
32.08            29.0117492750411 3.06825072495888
40.3633333333333 36.9767968381391 3.38653649519422
53.2266666666667 49.0826677983065 4.14399886836018
64.6066666666667 54.4678549541069 10.1388117125598
38.5366666666667 35.5059204731218 3.03074619354486
41.7233333333333 41.5333417555995 0.189991577733821
25.78            27.6069075391361 -1.82690753913609
33.4066666666667 31.2404889715121 2.16617769515461
27.8033333333333 27.8920960978598 -0.088762764526507
39.3266666666667 37.8505531149324 1.47611355173427
48.9933333333333 49.2616631533957 -0.268329820062384
25.2433333333333 30.366837650159  -5.12350431682565
32.67            31.1623492639066 1.5076507360934
55.17            55.0456078770405 0.124392122959534
42.92            42.772538591063  0.147461408936991
54.5866666666667 49.2419293590535 5.34473730761318
23.16            26.1963523976241 -3.03635239762411
64.6066666666667 54.4080781796616 10.1985884870051
40.7966666666667 44.9796700541254 -4.18300338745873
39.0166666666667 34.6996927469131 4.31697391975358
41.6333333333333 41.6227713664027 0.0105619669306023
35.8866666666667 36.8449646519306 -0.958297985263961
25.1             27.5318686661673 -2.43186866616734
23.2766666666667 31.6641793552795 -8.38751268861282
44.46            42.8198894266632 1.64011057333683
34.2166666666667 40.5769177148146 -6.36025104814794
40.8033333333333 40.5769177148146 0.226415618518729
24.5766666666667 29.3807781312816 -4.80411146461488
35.73            36.8579132935989 -1.1279132935989
61.8966666666667 55.5617033901752 6.33496327649151
62.1833333333333 55.8097119335638 6.37362139976954
74.6466666666667 55.1041728261666 19.5424938405001
39.4366666666667 43.6094641699075 -4.17279750324084
36.6             37.0674887276681 -0.467488727668119
27.1333333333333 27.3876960746536 -0.254362741320246
")

여기 더미가 있는 코드가 있습니다.geom_blank층,

range_act <- range(range(results$act), range(results$pred))

d <- reshape2::melt(results, id.vars = "pred")

dummy <- data.frame(pred = range_act, value = range_act,
                    variable = "act", stringsAsFactors=FALSE)

ggplot(d, aes(x = pred, y = value)) +
  facet_wrap(~variable, scales = "free") +
  geom_point(size = 2.5) + 
  geom_blank(data=dummy) + 
  theme_bw()

enter image description here

당신이 원하는 것을 이해할 수 있을지는 모르겠지만, 제가 이해한 것을 바탕으로 합니다.

x 척도가 동일한 것 같습니다. y 척도는 동일하지 않습니다. 이는 사용자가 지정했기 때문입니다.scales ="free"

지정할 수 있습니다.scales = "free_x"x만 자유롭게 허용(이 경우와 동일)pred정의에 따라 범위가 동일합니다.

p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free_x")

저를 위해 일했습니다, 사진을 보세요.

enter image description here

나는 네가 그것을 너무 어렵게 만들었다고 생각해 - 나는 min과 max가 있는 공식을 기반으로 한계를 정의했던 것을 한 번 기억하는 것 같아, 만약 직면한다면 나는 그것이 그 값들만 사용했다고 생각하지만, 나는 코드를 찾을 수 없어.

cord_cartesian 명령을 사용하여 범위를 지정하여 원하는 y축 범위를 설정할 수도 있습니다. 이전 사후 사용 척도 = free_x와 유사합니다.

p <- ggplot(plot, aes(x = pred, y = value)) +
     geom_point(size = 2.5) +
     theme_bw()+
     coord_cartesian(ylim = c(-20, 80))
p <- p + facet_wrap(~variable, scales = "free_x")
p

enter image description here

언급URL : https://stackoverflow.com/questions/18046051/setting-individual-axis-limits-with-facet-wrap-and-scales-free-in-ggplot2

반응형