Announcement

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

  • Overlapping plots for 2 periods

    Hello, I am having difficulties with a plot I am trying to make. I have data for 2 periods, for which I created a variable:
    Code:
    gen period = .
    replace period = 1 if (dofc(datetime) >= td(1aug2022) & dofc(datetime) <= td(31mar2023))
    replace period = 2 if (dofc(datetime) >= td(1aug2023) & dofc(datetime) <= td(31mar2024))
    I then collapsed the data to get daily means for my variables:
    Code:
    * Create a variable for the date (without time)
    gen date = dofc(datetime)
    format %td date
    * Calculate daily averages for each pollutant
    collapse (mean) pollutant, by(date location_name period)
    Code:
    * Example generated by -dataex-. For more info, type help dataex
    clear
    input str29 location_name float(period date) double pollutant
    "AmsterdamHaarlemmerwegNOx"     1 22858 25.408249999999995
    "AmsterdamJanvanGalenstraatNOx" 1 22858 19.104416666666662
    "AmsterdamStadhouderskadeNOx"   1 22858  26.94279166666667
    "AmsterdamVanDiemenstraatNOx"   1 22858 18.140708333333336
    "AmsterdamHaarlemmerwegNOx"     1 22859  51.79487499999999
    "AmsterdamJanvanGalenstraatNOx" 1 22859             34.751
    "AmsterdamStadhouderskadeNOx"   1 22859          30.427875
    "AmsterdamVanDiemenstraatNOx"   1 22859          29.260125
    "AmsterdamHaarlemmerwegNOx"     1 22860  62.93816666666667
    "AmsterdamJanvanGalenstraatNOx" 1 22860  43.93387499999999
    "AmsterdamStadhouderskadeNOx"   1 22860 34.135625000000005
    "AmsterdamVanDiemenstraatNOx"   1 22860  37.19404166666667
    "AmsterdamHaarlemmerwegNOx"     1 22861  48.97095833333333
    "AmsterdamJanvanGalenstraatNOx" 1 22861           40.59175
    "AmsterdamStadhouderskadeNOx"   1 22861 40.965833333333336
    "AmsterdamVanDiemenstraatNOx"   1 22861  31.92554166666666
    "AmsterdamHaarlemmerwegNOx"     1 22862           24.55225
    "AmsterdamJanvanGalenstraatNOx" 1 22862 13.993291666666664
    "AmsterdamStadhouderskadeNOx"   1 22862  21.94716666666667
    "AmsterdamVanDiemenstraatNOx"   1 22862 15.096708333333334
    "AmsterdamHaarlemmerwegNOx"     1 22863  52.17295833333333
    "AmsterdamJanvanGalenstraatNOx" 1 22863            27.3935
    "AmsterdamStadhouderskadeNOx"   1 22863            38.8675
    "AmsterdamVanDiemenstraatNOx"   1 22863  20.07716666666667
    "AmsterdamHaarlemmerwegNOx"     1 22864            61.8705
    "AmsterdamJanvanGalenstraatNOx" 1 22864  33.35783333333334
    "AmsterdamStadhouderskadeNOx"   1 22864  34.70204166666667
    "AmsterdamVanDiemenstraatNOx"   1 22864 18.903249999999996
    "AmsterdamHaarlemmerwegNOx"     1 22865 31.160708333333332
    "AmsterdamJanvanGalenstraatNOx" 1 22865  28.55679166666667
    "AmsterdamStadhouderskadeNOx"   1 22865  36.57366666666667
    "AmsterdamVanDiemenstraatNOx"   1 22865  15.43833333333333
    "AmsterdamHaarlemmerwegNOx"     1 22866 19.824166666666667
    "AmsterdamJanvanGalenstraatNOx" 1 22866          15.191125
    "AmsterdamStadhouderskadeNOx"   1 22866  38.65404166666666
    "AmsterdamVanDiemenstraatNOx"   1 22866 11.907083333333333
    "AmsterdamHaarlemmerwegNOx"     1 22867 14.210708333333336
    "AmsterdamJanvanGalenstraatNOx" 1 22867 13.104083333333335
    "AmsterdamStadhouderskadeNOx"   1 22867 28.665166666666664
    "AmsterdamVanDiemenstraatNOx"   1 22867 12.432708333333336
    "AmsterdamHaarlemmerwegNOx"     1 22868 20.532041666666668
    "AmsterdamJanvanGalenstraatNOx" 1 22868 17.529125000000004
    "AmsterdamStadhouderskadeNOx"   1 22868           31.42675
    "AmsterdamVanDiemenstraatNOx"   1 22868          17.015125
    "AmsterdamHaarlemmerwegNOx"     1 22869 22.865958333333335
    "AmsterdamJanvanGalenstraatNOx" 1 22869 18.561833333333336
    "AmsterdamStadhouderskadeNOx"   1 22869  32.60179166666667
    "AmsterdamVanDiemenstraatNOx"   1 22869 18.604916666666664
    "AmsterdamHaarlemmerwegNOx"     1 22870  70.42529166666665
    "AmsterdamJanvanGalenstraatNOx" 1 22870  40.00958333333334
    "AmsterdamStadhouderskadeNOx"   1 22870 31.134041666666672
    "AmsterdamVanDiemenstraatNOx"   1 22870  34.72895833333333
    "AmsterdamHaarlemmerwegNOx"     1 22871 30.570041666666658
    "AmsterdamJanvanGalenstraatNOx" 1 22871 19.245500000000003
    "AmsterdamStadhouderskadeNOx"   1 22871  20.79216666666667
    "AmsterdamVanDiemenstraatNOx"   1 22871           22.36775
    "AmsterdamHaarlemmerwegNOx"     1 22872  57.70708333333334
    "AmsterdamJanvanGalenstraatNOx" 1 22872 44.643499999999996
    "AmsterdamStadhouderskadeNOx"   1 22872 33.059583333333336
    "AmsterdamVanDiemenstraatNOx"   1 22872  33.79945833333333
    "AmsterdamHaarlemmerwegNOx"     1 22873  50.32695833333333
    "AmsterdamJanvanGalenstraatNOx" 1 22873  38.40058333333334
    "AmsterdamStadhouderskadeNOx"   1 22873  34.20541666666667
    "AmsterdamVanDiemenstraatNOx"   1 22873             29.693
    "AmsterdamHaarlemmerwegNOx"     1 22874          33.363875
    "AmsterdamJanvanGalenstraatNOx" 1 22874 26.531125000000003
    "AmsterdamStadhouderskadeNOx"   1 22874 30.497208333333333
    "AmsterdamVanDiemenstraatNOx"   1 22874 18.123083333333337
    "AmsterdamHaarlemmerwegNOx"     1 22875  41.52958333333333
    "AmsterdamJanvanGalenstraatNOx" 1 22875  27.20820833333333
    "AmsterdamStadhouderskadeNOx"   1 22875 30.805333333333333
    "AmsterdamVanDiemenstraatNOx"   1 22875 21.364999999999995
    "AmsterdamHaarlemmerwegNOx"     1 22876  58.07566666666667
    "AmsterdamJanvanGalenstraatNOx" 1 22876 41.393375000000006
    "AmsterdamStadhouderskadeNOx"   1 22876  33.58908333333333
    "AmsterdamVanDiemenstraatNOx"   1 22876  32.84766666666667
    "AmsterdamHaarlemmerwegNOx"     1 22877  52.10570833333332
    "AmsterdamJanvanGalenstraatNOx" 1 22877  32.31462500000001
    "AmsterdamStadhouderskadeNOx"   1 22877  27.93466666666667
    "AmsterdamVanDiemenstraatNOx"   1 22877 23.502208333333332
    "AmsterdamHaarlemmerwegNOx"     1 22878  42.36108333333334
    "AmsterdamJanvanGalenstraatNOx" 1 22878 25.066375000000008
    "AmsterdamStadhouderskadeNOx"   1 22878 31.159416666666672
    "AmsterdamVanDiemenstraatNOx"   1 22878 24.291958333333337
    "AmsterdamHaarlemmerwegNOx"     1 22879  39.05333333333333
    "AmsterdamJanvanGalenstraatNOx" 1 22879 31.203999999999997
    "AmsterdamStadhouderskadeNOx"   1 22879 19.156583333333334
    "AmsterdamVanDiemenstraatNOx"   1 22879           32.60225
    "AmsterdamHaarlemmerwegNOx"     1 22880           63.09825
    "AmsterdamJanvanGalenstraatNOx" 1 22880 52.655791666666666
    "AmsterdamStadhouderskadeNOx"   1 22880  33.80950000000001
    "AmsterdamVanDiemenstraatNOx"   1 22880  37.98970833333333
    "AmsterdamHaarlemmerwegNOx"     1 22881  53.02283333333332
    "AmsterdamJanvanGalenstraatNOx" 1 22881  40.19837500000001
    "AmsterdamStadhouderskadeNOx"   1 22881 36.459083333333325
    "AmsterdamVanDiemenstraatNOx"   1 22881           34.36575
    "AmsterdamHaarlemmerwegNOx"     1 22882  53.15616666666668
    "AmsterdamJanvanGalenstraatNOx" 1 22882  43.89016666666666
    "AmsterdamStadhouderskadeNOx"   1 22882  30.31045833333333
    "AmsterdamVanDiemenstraatNOx"   1 22882 53.116125000000004
    end
    format %td date

    I now want to make a separate plot for each location where those 2 periods overlap. But I get 2 separate graphs next to each other using this code:
    Code:
    twoway (line pollutant date if period == 1 & location_name == "AmsterdamStadhouderskadeNOx", lcolor(blue) lwidth(medium)) ///
           (line pollutant date if period == 2 & location_name == "AmsterdamStadhouderskadeNOx", lcolor(red) lwidth(medium)), ///
           title("Daily Averages for AmsterdamStadhouderskadeNOx") ///
           legend(label(1 "Aug 2022 - Mar 2023") label(2 "Aug 2023 - Mar 2024")) ///
           ytitle("(mean) pollutant") xtitle("date") ///
           xlabel(, angle(45))
    I tried a couple of things, but they all do not seem to work. Can you guys help me? Thanks in advance!

  • #2
    Maybe you can specify axes by using xaxis option. However, I think it's a misleading solution.
    Code:
    twoway (line pollutant date if period == 1 & location_name == "AmsterdamStadhouderskadeNOx", lcolor(blue) lwidth(medium) xaxis(1)) ///
           (line pollutant date if period == 2 & location_name == "AmsterdamStadhouderskadeNOx", lcolor(red) lwidth(medium) xaxis(2) xtitle("", axis(2))), ///
           title("Daily Averages for AmsterdamStadhouderskadeNOx") ///
           legend(label(1 "Aug 2022 - Mar 2023") label(2 "Aug 2023 - Mar 2024")) ///
           ytitle("(mean) pollutant") xtitle("date")

    Comment


    • #3
      I don't understand the question. The periods don't overlap. 1 is [td(1aug2022), td(31mar2023)] and 2 is [td(1aug2023), td(31mar2024)].

      Even if you did have overlapping periods, so that observations qualify for category 1 and category 2, the code would assign them to category 2/

      Comment


      • #4
        Originally posted by Nick Cox View Post
        I don't understand the question. The periods don't overlap. 1 is [td(1aug2022), td(31mar2023)] and 2 is [td(1aug2023), td(31mar2024)].

        Even if you did have overlapping periods, so that observations qualify for category 1 and category 2, the code would assign them to category 2/
        Sorry I probably did not explain my question properly. The periods don't overlap indeed, but I want the graphs of the 2 periods to overlap, to see the difference in fluctuations for the 2 periods

        Comment


        • #5

          I see! Calculate a new time variable which is days since the previous 31 July.

          Comment


          • #6
            Originally posted by Nick Cox View Post
            I see! Calculate a new time variable which is days since the previous 31 July.
            Hi Nick, can you help me a bit with this? I don't see how I would use this in the plot..

            Comment


            • #7
              Code:
              gen date2 = cond(period == 1, date - dmy(31,7,2022), cond(period == 2, date - dmy(31, 7, 2023), .))
              
              
              twoway (line pollutant date2 if period == 1 & location_name == "AmsterdamStadhouderskadeNOx", lcolor(blue) lwidth(medium)) ///
                     (line pollutant date2 if period == 2 & location_name == "AmsterdamStadhouderskadeNOx", lcolor(red) lwidth(medium)), ///
                     title("Daily Averages for AmsterdamStadhouderskadeNOx") ///
                     legend(label(1 "Aug 2022 - Mar 2023") label(2 "Aug 2023 - Mar 2024")) ///
                     ytitle("(mean) pollutant") xtitle("days after 31 July") ///
                     xlabel(1 "1 Aug" 32 "1 Sep" 62 "1 Oct" 93 "1 Nov" 123 "1 Dec" 154 "1 Jan" 185 "1 Feb" 213 "1 Mar")
              The axis labels aren't exactly right given 29 February 2024, but perhaps close enough for graphical purposes.

              Comment


              • #8
                Originally posted by Chen Samulsion View Post
                Maybe you can specify axes by using xaxis option. However, I think it's a misleading solution.
                Code:
                twoway (line pollutant date if period == 1 & location_name == "AmsterdamStadhouderskadeNOx", lcolor(blue) lwidth(medium) xaxis(1)) ///
                (line pollutant date if period == 2 & location_name == "AmsterdamStadhouderskadeNOx", lcolor(red) lwidth(medium) xaxis(2) xtitle("", axis(2))), ///
                title("Daily Averages for AmsterdamStadhouderskadeNOx") ///
                legend(label(1 "Aug 2022 - Mar 2023") label(2 "Aug 2023 - Mar 2024")) ///
                ytitle("(mean) pollutant") xtitle("date")
                I overlooked your suggestion, but this worked! Thank you so much

                Comment


                • #9
                  My guess is with #2 perfect alignment is not guaranteed without extra work. With #7 it is automatic.

                  Comment

                  Working...
                  X