R ggplot 直方图。如何根据另一个变量更改条形的颜色?

Posted

技术标签:

【中文标题】R ggplot 直方图。如何根据另一个变量更改条形的颜色?【英文标题】:R ggplot histogram. How to change the colour of the bars based of another variable? 【发布时间】:2019-06-16 00:51:56 【问题描述】:

我有一个包含 2 个变量的数据集(比如说 x 和 y)。 x 取值从 1 到 1000000,y 为 0 或 1。

我可以用 ggplot 为 x 绘制一个有 100 个 bin 的直方图

ggplot(data, aes(x=x))+geom_histogram(bins = 100).

但是,我希望根据该条范围内 y==1 的次数对每个条进行着色。数据集的重要一点是 y==1 的次数小于 1%。

谁能帮帮我?

编辑-澄清我的意思: x 是

[1]    2   10   10   10   12   18   33   35   38   42   44   46   59   60   64   69   69   73   74   76   78   83   84   84   85   88
  [27]   99   99  103  112  115  118  124  125  138  140  140  140  141  143  145  150  153  154  156  156  180  190  193  194  196  200
  [53]  205  209  221  225  227  230  231  234  237  239  241  244  248  256  259  259  260  266  267  273  280  282  283  284  288  290
  [79]  293  294  294  297  298  307  309  310  312  313  315  315  317  322  328  332  333  340  346  346  352  363  365  366  369  375
 [105]  378  380  382  384  386  387  399  403  403  406  411  425  427  427  433  439  441  442  443  446  448  450  453  457  459  460
 [131]  462  463  463  466  471  472  472  472  472  480  480  487  489  493  496  513  513  514  517  521  523  525  528  538  543  549
 [157]  550  550  551  564  566  581  588  592  600  605  610  610  614  614  623  628  629  631  642  646  646  648  651  654  654  656
 [183]  656  660  674  681  683  692  693  710  721  722  723  723  726  734  738  749  750  751  752  758  764  770  770  773  788  788
 [209]  790  795  804  804  805  809  810  811  821  823  830  862  862  866  868  869  874  881  890  892  899  905  907  908  909  909
 [235]  911  912  916  917  921  921  922  923  925  933  938  938  942  947  952  956  963  966  967  974  980  986 1000 1016 1023 1027
 [261] 1030 1034 1035 1036 1040 1052 1054 1055 1066 1071 1073 1074 1082 1082 1083 1084 1093 1097 1113 1114 1114 1117 1117 1120 1129 1132
 [287] 1138 1148 1152 1158 1161 1171 1174 1176 1177 1188 1201 1205 1206 1221 1227 1228 1230 1236 1238 1256 1259 1260 1261 1263 1264 1266
 [313] 1271 1272 1287 1290 1294 1295 1298 1303 1308 1317 1323 1324 1328 1332 1335 1340 1347 1352 1353 1354 1355 1356 1357 1363 1368 1379
 [339] 1380 1387 1396 1398 1399 1402 1403 1406 1410 1421 1421 1430 1432 1433 1434 1436 1443 1447 1459 1460 1464 1469 1471 1472 1474 1485
 [365] 1487 1488 1490 1494 1495 1496 1502 1502 1504 1506 1506 1518 1522 1526 1526 1531 1540 1548 1549 1552 1559 1562 1571 1573 1579 1580
 [391] 1582 1582 1587 1592 1599 1613 1619 1623 1631 1631 1634 1644 1655 1673 1673 1675 1681 1701 1704 1713 1719 1720 1720 1738 1757 1773
 [417] 1780 1784 1787 1793 1797 1801 1803 1812 1815 1817 1818 1820 1828 1832 1834 1835 1837 1839 1840 1840 1840 1842 1853 1870 1872 1873
 [443] 1873 1877 1881 1891 1895 1904 1906 1907 1926 1929 1937 1940 1947 1948 1951 1958 1982 1985 1993 1999 1999 2002 2012 2019 2023 2039
 [469] 2051 2054 2055 2057 2061 2061 2062 2086 2086 2090 2094 2095 2100 2103 2106 2106 2107 2108 2108 2108 2113 2113 2119 2125 2129 2148
 [495] 2154 2156 2156 2162 2165 2173 2184 2187 2189 2195 2208 2213 2213 2228 2242 2246 2269 2270 2270 2280 2280 2291 2292 2295 2301 2302
 [521] 2316 2319 2362 2368 2373 2397 2398 2400 2407 2416 2418 2421 2422 2423 2427 2428 2429 2430 2430 2431 2432 2435 2436 2437 2437 2440
 [547] 2440 2441 2441 2443 2466 2468 2469 2471 2471 2474 2477 2480 2483 2484 2494 2498 2500 2501 2519 2539 2542 2549 2550 2553 2565 2566
 [573] 2568 2573 2590 2601 2602 2604 2609 2614 2616 2618 2623 2640 2642 2645 2658 2663 2666 2669 2683 2690 2698 2699 2710 2714 2716 2718
 [599] 2718 2722 2731 2736 2742 2742 2743 2754 2757 2758 2777 2786 2790 2793 2793 2798 2800 2802 2805 2820 2829 2833 2834 2847 2853 2858
 [625] 2874 2890 2893 2895 2896 2904 2907 2908 2910 2912 2913 2914 2916 2919 2919 2920 2922 2922 2923 2924 2924 2925 2926 2927 2932 2935
 [651] 2938 2941 2942 2942 2949 2961 2975 2975 2984 2985 2993 2993 3006 3010 3017 3019 3021 3023 3037 3046 3047 3048 3049 3056 3056 3060
 [677] 3063 3066 3067 3068 3072 3081 3082 3083 3084 3086 3092 3102 3105 3106 3110 3110 3121 3122 3122 3135 3136 3142 3143 3143 3150 3152
 [703] 3154 3155 3157 3163 3186 3200 3222 3227 3228 3228 3232 3243 3248 3261 3261 3263 3270 3271 3276 3278 3308 3316 3317 3322 3327 3329
 [729] 3333 3345 3370 3373 3374 3374 3376 3381 3390 3405 3410 3423 3424 3436 3441 3464 3472 3483 3485 3493 3498 3512 3529 3533 3543 3562
 [755] 3583 3610 3617 3624 3626 3629 3630 3635 3636 3637 3637 3640 3646 3648 3662 3684 3686 3695 3697 3724 3726 3729 3734 3737 3738 3738
 [781] 3739 3740 3741 3745 3745 3745 3746 3746 3746 3746 3747 3747 3747 3748 3748 3748 3749 3749 3750 3750 3751 3751 3752 3752 3752 3752
 [807] 3753 3753 3753 3753 3754 3754 3754 3754 3754 3754 3755 3755 3755 3755 3755 3756 3756 3756 3756 3757 3757 3757 3757 3757 3758 3758
 [833] 3759 3760 3760 3760 3762 3763 3763 3765 3766 3767 3767 3767 3767 3769 3769 3770 3770 3770 3770 3770 3771 3772 3786 3794 3803 3803
 [859] 3810 3814 3819 3825 3826 3835 3838 3842 3851 3852 3854 3862 3865 3882 3889 3896 3915 3923 3947 3950 3960 3967 3969 3970 3971 3983
 [885] 3992 4015 4029 4048 4085 4105 4107 4118 4118 4129 4148 4153 4153 4168 4179 4182 4185 4209 4228 4230 4241 4245 4250 4267 4276 4280
 [911] 4280 4287 4299 4319 4322 4328 4329 4337 4350 4355 4363 4368 4387 4391 4395 4398 4402 4415 4422 4429 4433 4433 4442 4462 4466 4469
 [937] 4480 4485 4493 4496 4498 4519 4526 4528 4537 4540 4543 4549 4552 4553 4558 4558 4571 4578 4630 4636 4636 4636 4641 4648 4650 4662
 [963] 4690 4719 4729 4744 4747 4769 4771 4783 4787 4792 4827 4846 4855 4871 4871 4880 4894 4917 4933 4942 4956 4958 4963 4977 4983 4995
 [989] 5032 5037 5043 5093 5098 5102 5111 5112 5115 5137 5149 5155
 [ reached getOption("max.print") -- omitted 49247 entries ]

y 是:

   [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  [66] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [131] 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [196] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [261] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [326] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [391] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [456] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [521] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [586] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [651] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [716] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [781] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [846] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [911] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [976] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [ reached getOption("max.print") -- omitted 49247 entries ]

x' 总结是:

Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      2   54242   84428   94452  139052  172792 

和你的表:

    0     1 
49755   492 

ggplot(data, aes(x=x))+geom_histogram(bins = 100) 给我以下情节:

对于每个条,我需要将颜色更改为(例如)蓝色的不同阴影,基于如果条表示的范围 y 值为 1 的次数

编辑2:

df <- data.frame(a=c(rep("T", 800), rep("F", 200)), b=round(runif(1000, min=1, max=100)))
df$c<-cut_number(df$b, n=100)
df<-group_by(df, c) %>% mutate(ag=sum(a=="F"))
ggplot(df) + geom_bar(aes(x=c, fill=ag))

【问题讨论】:

你能解释一下“ y==1 in the range of that bar”是什么意思吗? aes(x=x,fill=y) 不会改变情节 是的,我误解了你的问题。检查我上面的新评论。感谢@iod。 【参考方案1】:

您不能直接使用直方图执行此操作,因此您必须手动创建自己的条形图,方法是将数据分成适当的组并为每个组分配其 a==1 的比例(或示例中的 F以下)。然后,您可以稍微调整一下主题,使其更类似于直方图的默认设置。

数据:

df <- data.frame(a=c(rep("T", 800), rep("F", 200)), b=round(runif(1000, min=1, max=100)))

在 df 内创建组(binnum=bin 数):

binnum=10
df$c<-cut_interval(df$b, n=binnum)
df<-group_by(df, c) %>% mutate(ag=sum(a=="F")) #for each group, find the number of times a is "F"
ggplot(df) + geom_bar(aes(x=c, fill=ag)) # create a histogram based on the bins created, filled based on the number of times a is F

结果:

现在稍微调整一下外观:

要使空格为零,请将width=1 添加到您的geom_bar()。 要调整刻度,我们可以这样做:

binnum<-50
df$d<-as.integer(df$c)*nrow(df)/binnum #create a row of the max of each bin
ggplot(df) + geom_bar(aes(x=as.factor(d), fill=ag), width=1) +
  scale_x_discrete(breaks=plyr::round_any(seq(1,max(df$d),length.out = 4),max(df$d)/binnum,f=ceiling)) # change the length.out to the number of ticks you want

结果:

【讨论】:

我试过这个,我得到了上面包含的情节。我认为它已经接近我想要的,但现在直方图看起来不同了。 对不起,我的错。应该是cut_interval,而不是cut_number 另外,我并不是要成为一个挑剔的乞丐,但是您知道将其制成直方图的方法吗?就像使条形之间的空间为零,并更改刻度标签。 那里。添加了更多代码,使其看起来更像默认直方图

以上是关于R ggplot 直方图。如何根据另一个变量更改条形的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

用ggplot2直方图中另一个连续变量的平均值填充条形颜色

R语言ggplot2可视化分组变量下的数据分布(线条色彩配置)WVPlots包的ShadowHist函数比较分组下的数据直方图ggplot2分面图facet_wrap可视化分组变量下的数据分布

我无法使用 ggplot 在 r 中填充直方图

R语言ggplot2可视化:可视化人口金字塔图直方图(堆叠直方图连续变量堆叠直方图离散变量堆叠直方图)密度图箱图(添加抖动数据点tufte箱图多分类变量分组箱图)小提琴图

如何在ggplot的直方图条上打印频率

使用 stat_bin ggplot 的颜色直方图条