Гистограммы с разными цветами - PullRequest
1 голос
/ 24 сентября 2019

Я хотел бы получить гистограмму с чередующимися градиентами данного цвета в соответствии с точками останова дециля, как показано на рисунке ниже:

enter image description here

Пример данных:

clear
input float dn3001 double hw0010
  1219000 2823.89408574376
   -16390 520.112200750285
   121010 238.732322261911
   953839 221.316063150235
   465000 247.280750487467
     -870 280.305382323347
    96000 2946.16661611018
    69500  355.33497718705
   113000 1421.43087298696
    30500 616.914514202173
    20000 3389.34765405599
   154000 305.674687642557
   440500 525.694777777734
    56870 1823.24691219821
   330500 376.651172915574
   101000 465.098273950744
 401046.5 660.816203440777
    31872 1693.02190101773
   220345 603.326244510505
   193360 677.527413164373
   196300 568.436679602066
   222640 427.051692314575
   510500 318.557431587468
   131450 1388.72862441839
   122300 532.996690473983
      305 2441.72289873923
   313500 292.610321722557
   184500 2699.67735757755
1615564.6 386.944439319246
   126528 3018.77523617479
   711110 511.604491869939
   127440 256.968118266053
   424900   1620.366555701
    95491 3097.46262561529
   287500 413.119620218929
    70050 2119.47171174278
    75460 299.232446656805
   210500 290.391474820414
   135800 292.141670444933
   119924 303.953183619671
    81075 1568.41438245214
      152 289.175871985445
    73000 2551.12752046544
   246500 327.474430367518
   159960 2350.26463245568
    14522  456.56909870547
   139000 319.451311193507
    68661 2771.34087931684
 214089.7 388.589383036063
   927800 849.088069585408
     7840 1512.71702946577
   140140 852.940547469624
21646.566 2405.47949923772
end

Приведенный ниже код создает график с неравномерным разбросом баров:

xtile aux = dn3001 [aw=hw0010], nq(10)
_pctile dn3001[aw=hw0010], nq(10)
sort dn3001 
list dn3001 aux
return list
scalar p10=r(r1)
scalar p20=r(r2)
scalar p30=r(r3)
scalar p40=r(r4)
scalar p50=r(r5)
scalar p60=r(r6)
scalar p70=r(r7)
scalar p80=r(r8)
scalar p90=r(r9)
drop aux
sum dn3001 [aw=hw0010], d
scalar p1=r(p1)
scalar p95=r(p95)
twoway histogram dn3001 if dn3001>=scalar(p1) & dn3001<scalar(p10),  bcolor(green%20) freq legend(off) ///
    || histogram dn3001 if dn3001>=scalar(p10) & dn3001<scalar(p20),  bcolor(green) freq legend(off) ///
    || histogram dn3001 if dn3001>=scalar(p20) & dn3001<scalar(p30),  bcolor(green%20) freq legend(off) /// 
    || histogram dn3001 if dn3001>=scalar(p30) & dn3001<scalar(p40),  bcolor(green) freq legend(off) ///
    || histogram dn3001 if dn3001>=scalar(p40) & dn3001<scalar(p50),  bcolor(green%20) freq legend(off) /// 
    || histogram dn3001 if dn3001>=scalar(p50) & dn3001<scalar(p60),  bcolor(green) freq legend(off) ///
    || histogram dn3001 if dn3001>=scalar(p60) & dn3001<scalar(p70),  bcolor(green%20) freq legend(off) ///
    || histogram dn3001 if dn3001>=scalar(p70) & dn3001<scalar(p80),  bcolor(green) freq legend(off) ///
    || histogram dn3001 if dn3001>=scalar(p80) & dn3001<scalar(p90),  bcolor(green%20) freq legend(off) ///
    || histogram dn3001 if dn3001>=scalar(p90) & dn3001<scalar(p95),  bcolor(green) freq legend(off)

Output

Как получить такую ​​же ширину баров?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Больше комментария (или серии комментариев), чем ответа, который вы ищете, но график не помещается в комментарии.

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

  1. Нет никакой гарантии, что какой-либо из ваших пределов квантильного бина будет соответствовать любому из пределов бина гистограммы.

  2. Точно так же нет гарантии, что разница между соседними квантилями будет кратна любой ширине бина гистограммы, которую вы можете выбрать.Вы могли бы поддаться искушению обмануть это, раскрасив столбец в зависимости от того, какая квантильная корзина встречается чаще, но это будет игнорировать детали.Итак, предположим, что ваша гистограмма была для [100, 200), но некоторые значения в этом интервале принадлежат одному квантильному элементу, а другие - другому: что бы вы сделали?И что бы вы сделали, если бы 3 или более квантильных бина попали в гистограмму?

  3. Указав несколько гистограмм без указания начальных значений или ширины бинов, вы развязываете анархию.Stata будет принимать отдельные решения для каждой гистограммы, основываясь частично на размерах выборки.Вот что говорит ваш код, но не то, что вы хотите.

  4. Ваши гистограммы ничего не знают об используемых вами аналитических весах.

Помимо этого, ваш вопрос поднимает всевозможные ненужные головоломки.

  • Зачем производить aux и ничего с этим не делать?Это стандартное искусство SO, чтобы показать минимальный код, необходимый для объяснения вашей проблемы.

  • Вы говорите, что заинтересованы в децилях, но непоследовательно также работаете с 1 и 95% процентилями.

Почему у вас есть такие нерегулярные значения с очень разными весами, неясно, но несущественно для вашего непосредственного вопроса.Но все это заставляет меня думать, что вы не можете легко или эффективно получить гистограмму, такую ​​как пример, из ваших данных.У вас всего 53 точки данных, и поэтому вес не имеет значения, если вы не можете иметь более 53 непустых корзин.

Как границы ячеек падают относительно данных, может быть показано непосредственно без гистограммы.

С вашими примерами (спасибо!) Я делаю это

xtile aux = dn3001 [aw=hw0010], nq(10)

quantile dn3001, ms(none) mla(aux) mlabpos(0) scheme(s1color) rlopts(lc(none))

enter image description here

Я бы использовал логарифмическую шкалу обычно, но отрицательноценности исключают это.

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

0 голосов
/ 28 сентября 2019

Вот один из возможных подходов:

twoway__histogram_gen dn3001, freq bin(50) generate(b a, replace)

_pctile dn3001 [aw=hw0010], nq(10)

return list

scalars:
                 r(r1) =  20000
                 r(r2) =  30500
                 r(r3) =  68661
                 r(r4) =  75460
                 r(r5) =  96000
                 r(r6) =  126528
                 r(r7) =  159960
                 r(r8) =  196300
                 r(r9) =  440500

generate group = .

forvalues i = 9(-1)1 {
    replace group = `i' if a <= `r(r`i')'
}

replace group = 10 if a > `r(r9)' & _n <= 20
list a b group in 1 / 20, sepby(group)

     +-----------------------+
     |         a   b   group |
     |-----------------------|
  1. | -70.45375   6       1 |
     |-----------------------|
  2. |  32568.64   4       3 |
  3. |  65207.73   7       3 |
     |-----------------------|
  4. |  97846.82   4       6 |
     |-----------------------|
  5. |  130485.9   9       7 |
     |-----------------------|
  6. |    163125   2       8 |
  7. |  195764.1   4       8 |
     |-----------------------|
  8. |  228403.2   3       9 |
  9. |  261042.3   1       9 |
 10. |  293681.4   1       9 |
 11. |  326320.5   2       9 |
 12. |  391598.7   1       9 |
 13. |  424237.8   2       9 |
     |-----------------------|
 14. |  456876.8   1      10 |
 15. |    522155   1      10 |
 16. |  717989.6   1      10 |
 17. |  913824.1   1      10 |
 18. |  946463.3   1      10 |
 19. |   1207576   1      10 |
 20. |   1599245   1      10 |
     +-----------------------+

Результат:

twoway (bar b a, barwidth(25000) legend(off)) ///
       (bar b a if group == 3, barwidth(25000) color(green)) ///
       (bar b a if group == 9, barwidth(25000) color(red))

enter image description here

...