Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Multiple Bar graps on a single axis

    Hi. I have three binary variables with "Yes" and "No" categories and I need these three variables to be plotted on a single axis in Stata. An excel graph is shown for guidance. I need a similar graph in Stata. Please help me as I am struggling with this.
    Code:
    Click image for larger version

Name:	Bar.PNG
Views:	1
Size:	8.0 KB
ID:	1677397
    Thank you in anticipation

  • #2
    Here's one approach. Lacking a data example I faked it. This uses tabplot from the Stata Journal. You didn't ask for frames, but I like them.

    Code:
    clear
    set obs 1000
    gen dw = _n > 909
    gen ra = _n > 233
    gen vh = _n > 364
    
    label var dw "drinking water"
    label var ra "road access"
    label var vh "own a vehicle"
    
    label def binary 0 no 1 yes
    
    foreach v in dw ra vh {
        label val `v' binary
    }
    
    preserve
    rename (dw ra vh) (y1 y2 y3)
    gen id = _n
    reshape long y, i(id) j(which)  
    
    label def y 0 no 1 yes
    label val y y
    
    label def which 1 "drinking water" 2 "road access" 3 "own vehicle"
    label val which which
    
    drop if missing(y)
    bysort y which : gen freq = _N
    bysort which : gen total = _N
    gen show = string(100 * freq/total, "%2.1f") + "%"
    
    tabplot y, by(which, row(1) note("")) xtitle("") percent(which) showval(show, mlabsize(medlarge)) ///
    separate(y) bar1(color(blue)) bar2(color(orange)) subtitle(, fcolor(green*0.1)) frame(100)
    
    restore
    Click image for larger version

Name:	tabplot_frame.png
Views:	1
Size:	25.8 KB
ID:	1677432

    Last edited by Nick Cox; 11 Aug 2022, 18:16.

    Comment


    • #3
      Hello Nick Cox . Thank you for the response. I am a bit confused with the notations assumed in the example data set. Please consider this data set and specify the commands. The data is for seven different settlements labeled with numeric codes, and the three variables need a single bar graph for each settlement.

      Code:
      * Example generated by -dataex-. To install: ssc install dataex
      clear
      input long(settlementname cdw_access house_accessibility vehicle)
      1 1 2 1
      5 2 1 2
      1 1 2 1
      5 1 1 1
      1 2 2 2
      5 2 1 1
      5 2 2 .
      1 1 2 1
      5 1 2 2
      1 1 2 2
      5 1 1 1
      5 1 1 2
      5 1 1 2
      5 . 2 2
      1 2 2 2
      5 2 2 2
      5 2 2 1
      5 2 2 .
      5 1 1 2
      5 2 1 .
      5 2 2 1
      5 2 2 .
      5 2 2 1
      5 2 2 2
      5 2 2 2
      5 2 2 1
      5 1 2 2
      5 2 2 1
      1 1 2 1
      5 1 . .
      5 1 2 1
      5 1 2 2
      5 . 2 2
      5 1 2 .
      5 2 2 1
      5 1 1 .
      5 2 1 1
      5 2 1 .
      5 1 . 1
      5 2 2 .
      5 2 1 1
      5 1 1 1
      5 2 2 1
      5 1 2 2
      5 2 1 1
      5 1 2 .
      5 2 1 2
      5 2 1 .
      5 1 2 1
      1 1 2 1
      5 2 2 2
      5 2 2 1
      5 2 1 2
      1 1 2 1
      1 1 2 1
      1 1 2 2
      1 1 2 1
      1 1 2 1
      1 1 2 1
      1 1 2 1
      1 1 2 1
      1 1 2 2
      1 1 2 1
      1 1 2 1
      1 1 2 2
      1 1 2 1
      1 1 2 2
      1 1 2 1
      5 2 2 2
      1 1 2 2
      2 1 2 2
      2 1 2 .
      1 1 2 1
      2 1 2 2
      2 2 2 1
      1 1 2 1
      2 2 2 2
      2 2 2 2
      2 1 2 2
      2 1 2 1
      1 1 2 2
      2 1 1 1
      5 2 2 2
      1 1 2 2
      2 1 2 1
      5 1 1 2
      1 2 1 1
      2 1 2 2
      2 1 2 1
      1 1 2 2
      2 1 2 2
      2 1 2 2
      5 2 2 1
      2 2 2 1
      1 1 1 2
      2 1 2 2
      5 2 1 1
      2 1 2 2
      2 1 2 1
      1 1 2 1
      end
      label values settlementname settlementname_lbl
      label def settlementname_lbl 1 "Gahkuch Kharee", modify
      label def settlementname_lbl 2 "Gahkuch Paeen", modify
      label def settlementname_lbl 5 "Hatoon Dass", modify
      label values cdw_access cdw_lbl
      label def cdw_lbl 1 "Yes", modify
      label def cdw_lbl 2 "No", modify
      label values house_accessibility house_accessibility_lbl
      label def house_accessibility_lbl 1 "Yes", modify
      label def house_accessibility_lbl 2 "No", modify
      label values vehicle vehicle_lbl
      label def vehicle_lbl 1 "Yes", modify
      label def vehicle_lbl 2 "No", modify

      Comment


      • #4
        I couldn't use your variable names or example data because you didn't show us either. And wanting to do this by settlement changes the question.

        Here is some code, but this is going to get very crowded for 7 settlements. Given that % yes = 100 - % no, why not just plot one of those two?

        Code:
        * Example generated by -dataex-. To install: ssc install dataex
        clear
        input long(settlementname cdw_access house_accessibility vehicle)
        1 1 2 1
        5 2 1 2
        1 1 2 1
        5 1 1 1
        1 2 2 2
        5 2 1 1
        5 2 2 .
        1 1 2 1
        5 1 2 2
        1 1 2 2
        5 1 1 1
        5 1 1 2
        5 1 1 2
        5 . 2 2
        1 2 2 2
        5 2 2 2
        5 2 2 1
        5 2 2 .
        5 1 1 2
        5 2 1 .
        5 2 2 1
        5 2 2 .
        5 2 2 1
        5 2 2 2
        5 2 2 2
        5 2 2 1
        5 1 2 2
        5 2 2 1
        1 1 2 1
        5 1 . .
        5 1 2 1
        5 1 2 2
        5 . 2 2
        5 1 2 .
        5 2 2 1
        5 1 1 .
        5 2 1 1
        5 2 1 .
        5 1 . 1
        5 2 2 .
        5 2 1 1
        5 1 1 1
        5 2 2 1
        5 1 2 2
        5 2 1 1
        5 1 2 .
        5 2 1 2
        5 2 1 .
        5 1 2 1
        1 1 2 1
        5 2 2 2
        5 2 2 1
        5 2 1 2
        1 1 2 1
        1 1 2 1
        1 1 2 2
        1 1 2 1
        1 1 2 1
        1 1 2 1
        1 1 2 1
        1 1 2 1
        1 1 2 2
        1 1 2 1
        1 1 2 1
        1 1 2 2
        1 1 2 1
        1 1 2 2
        1 1 2 1
        5 2 2 2
        1 1 2 2
        2 1 2 2
        2 1 2 .
        1 1 2 1
        2 1 2 2
        2 2 2 1
        1 1 2 1
        2 2 2 2
        2 2 2 2
        2 1 2 2
        2 1 2 1
        1 1 2 2
        2 1 1 1
        5 2 2 2
        1 1 2 2
        2 1 2 1
        5 1 1 2
        1 2 1 1
        2 1 2 2
        2 1 2 1
        1 1 2 2
        2 1 2 2
        2 1 2 2
        5 2 2 1
        2 2 2 1
        1 1 1 2
        2 1 2 2
        5 2 1 1
        2 1 2 2
        2 1 2 1
        1 1 2 1
        end
        label values settlementname settlementname_lbl
        label def settlementname_lbl 1 "Gahkuch Kharee", modify
        label def settlementname_lbl 2 "Gahkuch Paeen", modify
        label def settlementname_lbl 5 "Hatoon Dass", modify
        label values cdw_access cdw_lbl
        label def cdw_lbl 1 "Yes", modify
        label def cdw_lbl 2 "No", modify
        label values house_accessibility house_accessibility_lbl
        label def house_accessibility_lbl 1 "Yes", modify
        label def house_accessibility_lbl 2 "No", modify
        label values vehicle vehicle_lbl
        label def vehicle_lbl 1 "Yes", modify
        label def vehicle_lbl 2 "No", modify
        
        preserve
        rename (cdw_access house_accessibility vehicle) (y1 y2 y3)
        bysort settlement : gen id = _n
        reshape long y, i(id settlement) j(which)  
        
        replace y = 2 - y 
        label def y 0 no 1 yes
        label val y y
        
        label def which 1 "drinking water" 2 "road access" 3 "own vehicle"
        label val which which
        
        drop if missing(y)
        bysort settlement y which : gen freq = _N
        bysort settlement which : gen total = _N
        gen show = string(100 * freq/total, "%2.1f") + "%"
        
        
        forval s = 1/7 { 
            count if settlement == `s'
            
            if r(N) > 0 { 
            local name : label (settlementname) `s' 
        tabplot y if settlement == `s', by(which, row(1) note("") title("`name'")) xtitle("") percent(which) showval(show, mlabsize(medium)) ///
        separate(y) bar1(color(blue)) bar2(color(orange)) subtitle(, fcolor(green*0.1)) frame(100)  name(G`s', replace)
          
            local graphs `graphs' G`s'
        } 
        } 
        
        graph combine `graphs'
        
        restore

        Click image for larger version

Name:	villagestoo.png
Views:	1
Size:	34.0 KB
ID:	1677487

        Comment


        • #5
          Here is another approach. Your binary variables are coded 2 for No and 1 for Yes. See e.g. https://www.stata-journal.com/articl...article=dm0099 for some of the many advantages of (0, 1) indicator coding.

          The % with access to any amenity is the mean of 100 (2 - amenity), so we can do things like this:

          Code:
          * Example generated by -dataex-. To install: ssc install dataex
          clear
          input long(settlementname cdw_access house_accessibility vehicle)
          1 1 2 1
          5 2 1 2
          1 1 2 1
          5 1 1 1
          1 2 2 2
          5 2 1 1
          5 2 2 .
          1 1 2 1
          5 1 2 2
          1 1 2 2
          5 1 1 1
          5 1 1 2
          5 1 1 2
          5 . 2 2
          1 2 2 2
          5 2 2 2
          5 2 2 1
          5 2 2 .
          5 1 1 2
          5 2 1 .
          5 2 2 1
          5 2 2 .
          5 2 2 1
          5 2 2 2
          5 2 2 2
          5 2 2 1
          5 1 2 2
          5 2 2 1
          1 1 2 1
          5 1 . .
          5 1 2 1
          5 1 2 2
          5 . 2 2
          5 1 2 .
          5 2 2 1
          5 1 1 .
          5 2 1 1
          5 2 1 .
          5 1 . 1
          5 2 2 .
          5 2 1 1
          5 1 1 1
          5 2 2 1
          5 1 2 2
          5 2 1 1
          5 1 2 .
          5 2 1 2
          5 2 1 .
          5 1 2 1
          1 1 2 1
          5 2 2 2
          5 2 2 1
          5 2 1 2
          1 1 2 1
          1 1 2 1
          1 1 2 2
          1 1 2 1
          1 1 2 1
          1 1 2 1
          1 1 2 1
          1 1 2 1
          1 1 2 2
          1 1 2 1
          1 1 2 1
          1 1 2 2
          1 1 2 1
          1 1 2 2
          1 1 2 1
          5 2 2 2
          1 1 2 2
          2 1 2 2
          2 1 2 .
          1 1 2 1
          2 1 2 2
          2 2 2 1
          1 1 2 1
          2 2 2 2
          2 2 2 2
          2 1 2 2
          2 1 2 1
          1 1 2 2
          2 1 1 1
          5 2 2 2
          1 1 2 2
          2 1 2 1
          5 1 1 2
          1 2 1 1
          2 1 2 2
          2 1 2 1
          1 1 2 2
          2 1 2 2
          2 1 2 2
          5 2 2 1
          2 2 2 1
          1 1 1 2
          2 1 2 2
          5 2 1 1
          2 1 2 2
          2 1 2 1
          1 1 2 1
          end
          label values settlementname settlementname_lbl
          label def settlementname_lbl 1 "Gahkuch Kharee", modify
          label def settlementname_lbl 2 "Gahkuch Paeen", modify
          label def settlementname_lbl 5 "Hatoon Dass", modify
          label values cdw_access cdw_lbl
          label def cdw_lbl 1 "Yes", modify
          label def cdw_lbl 2 "No", modify
          label values house_accessibility house_accessibility_lbl
          label def house_accessibility_lbl 1 "Yes", modify
          label def house_accessibility_lbl 2 "No", modify
          label values vehicle vehicle_lbl
          label def vehicle_lbl 1 "Yes", modify
          label def vehicle_lbl 2 "No", modify
          
          * start here 
          label var cdw "drinking water"
          label var house "road access"
          label var vehicle "own vehicle"
          
          local j = 1 
          foreach v of var cdw house vehicle {
              clonevar `v'2 = `v' 
              replace `v'2 = 100 * (2 - `v'2) 
              local legend `legend' `j' "`: var label `v''"
              local ++j 
          }
          
          graph hbar cdw_access2 house_accessibility2 vehicle2, over(settlementname) legend(col(1) pos(3) order(`legend')) ///
          bar(1, lcolor(orange*2) fcolor(orange*0.2)) bar(2, lcolor(blue*2) fcolor(blue*0.2)) bar(3, lcolor(black*2) fcolor(black*0.2)) linetype(line) lines(lc(gs8) lw(vthin)) yla(0 25 50 75 100) blabel(total, format(%2.1f)) ysc(alt) ytitle(% with access)
          Click image for larger version

Name:	villagestoo2.png
Views:	1
Size:	26.2 KB
ID:	1677500


          For 7 villages, that will be more crowded and the order of villages might be best something other than alphabetical.

          There are other designs too.

          Comment


          • #6
            Yet more....

            Working backwards from having 7 villages you'll need to show those names legibly, which probably implies putting them on the y axis.

            Code:
            * Example generated by -dataex-. To install: ssc install dataex
            clear
            input long(settlementname cdw_access house_accessibility vehicle)
            1 1 2 1
            5 2 1 2
            1 1 2 1
            5 1 1 1
            1 2 2 2
            5 2 1 1
            5 2 2 .
            1 1 2 1
            5 1 2 2
            1 1 2 2
            5 1 1 1
            5 1 1 2
            5 1 1 2
            5 . 2 2
            1 2 2 2
            5 2 2 2
            5 2 2 1
            5 2 2 .
            5 1 1 2
            5 2 1 .
            5 2 2 1
            5 2 2 .
            5 2 2 1
            5 2 2 2
            5 2 2 2
            5 2 2 1
            5 1 2 2
            5 2 2 1
            1 1 2 1
            5 1 . .
            5 1 2 1
            5 1 2 2
            5 . 2 2
            5 1 2 .
            5 2 2 1
            5 1 1 .
            5 2 1 1
            5 2 1 .
            5 1 . 1
            5 2 2 .
            5 2 1 1
            5 1 1 1
            5 2 2 1
            5 1 2 2
            5 2 1 1
            5 1 2 .
            5 2 1 2
            5 2 1 .
            5 1 2 1
            1 1 2 1
            5 2 2 2
            5 2 2 1
            5 2 1 2
            1 1 2 1
            1 1 2 1
            1 1 2 2
            1 1 2 1
            1 1 2 1
            1 1 2 1
            1 1 2 1
            1 1 2 1
            1 1 2 2
            1 1 2 1
            1 1 2 1
            1 1 2 2
            1 1 2 1
            1 1 2 2
            1 1 2 1
            5 2 2 2
            1 1 2 2
            2 1 2 2
            2 1 2 .
            1 1 2 1
            2 1 2 2
            2 2 2 1
            1 1 2 1
            2 2 2 2
            2 2 2 2
            2 1 2 2
            2 1 2 1
            1 1 2 2
            2 1 1 1
            5 2 2 2
            1 1 2 2
            2 1 2 1
            5 1 1 2
            1 2 1 1
            2 1 2 2
            2 1 2 1
            1 1 2 2
            2 1 2 2
            2 1 2 2
            5 2 2 1
            2 2 2 1
            1 1 1 2
            2 1 2 2
            5 2 1 1
            2 1 2 2
            2 1 2 1
            1 1 2 1
            end
            label values settlementname settlementname_lbl
            label def settlementname_lbl 1 "Gahkuch Kharee", modify
            label def settlementname_lbl 2 "Gahkuch Paeen", modify
            label def settlementname_lbl 5 "Hatoon Dass", modify
            label values cdw_access cdw_lbl
            label def cdw_lbl 1 "Yes", modify
            label def cdw_lbl 2 "No", modify
            label values house_accessibility house_accessibility_lbl
            label def house_accessibility_lbl 1 "Yes", modify
            label def house_accessibility_lbl 2 "No", modify
            label values vehicle vehicle_lbl
            label def vehicle_lbl 1 "Yes", modify
            label def vehicle_lbl 2 "No", modify
            
            * start here 
            label var cdw "drinking water"
            label var house "road access"
            label var vehicle "own vehicle"
            
            local j = 1 
            foreach v of var cdw house vehicle {
                clonevar `v'2 = `v' 
                replace `v'2 = 100 * (2 - `v'2) 
                local legend `legend' `j' "`: var label `v''"
                local ++j 
            }
            
            collapse (mean) cdw_access2 house_accessibility2 vehicle2, by(settlementname) 
            
            rename (*2) (percent1 percent2 percent3)
            
            reshape long percent , i(settlementname) j(amenity) 
            
            label def amenity 1 "drinking water" 2 "road access" 3 "own vehicle"
            label val amenity amenity 
            
            set scheme s1color 
            
            tabplot settlementname amenity [iw=percent], horizontal frame(100) height(0.7) ///
            showval(format(%2.1f)) xsc(r(0.8 .)) separate(amenity) ytitle("") xtitle("") subtitle(% with access) ///
            bar1(lcolor(orange*2) fcolor(orange*0.5)) bar2(lcolor(blue*2) fcolor(blue*0.5)) bar3(lcolor(black*2) fcolor(black*0.5))
            
            restore
            Click image for larger version

Name:	villagestoo3.png
Views:	1
Size:	25.2 KB
ID:	1677508


            Comment


            • #7
              Thank you so much Nick Cox sir.

              Comment

              Working...
              X