I would like to control date labels. I am looping over various subsets of the data, sometimes plotting long intervals where a tick every 10 years would be appropriate; sometimes shorter intervals where a tick every 5 or 2 or 1 year would be appropriate; sometimes plotting an interval of several months, where month labels would be appropriate; sometimes a hybrid situation. I know how to convert my dates to strings and extract the year and make labels manually, but because my date ranges keep changing, I would like a certain degree of flexibility and as much as possible would like to use built-in functions. I've tried to use these matplotlib.dates functions: AutoDateLocator, ConciseDateFormatter, YearLocator, DateFormatter: See the museum of horrors below. I seem to be missing something fundamental.
In the example below, the default date labels are 1949, 1959, etc. and I would like 1950, 1960, etc., so the frequency of labels is great, but the starting date is not. Is there a way to automate that the selected years be multiples of 10 or 5?
Thanks for pointers!
DEFAULT PLOT
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Timestamp
from numpy import nan
# Default plot:
f, ax = plt.subplots()
df.plot(ax=ax, x='Date')
plt.show()
# attempt 1
# https://matplotlib.org/stable/api/dates_api.html
from matplotlib.dates import YearLocator, DateFormatter
f, ax = plt.subplots()
df.plot(ax=ax, x='Date')
ax.xaxis.set_major_locator(YearLocator(10)) # <- ticks every 10 years
ax.xaxis.set_major_formatter(DateFormatter('%Y')) # <- show only the year
plt.show()
# attempt 2
# https://matplotlib.org/stable/gallery/ticks/date_concise_formatter.html
from matplotlib.dates import AutoDateLocator, ConciseDateFormatter
f, ax = plt.subplots()
df.plot(ax=ax, x='Date')
locator = AutoDateLocator(minticks=4, maxticks=10) # <- autodetect a good place to place ticks
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(ConciseDateFormatter(locator))
plt.show() # <- Months appear where they shouldn't
Data:
data_dict = {'Date': {0: Timestamp('1946-01-01 00:00:00'), 1: Timestamp('1946-04-01 00:00:00'), 2: Timestamp('1946-07-01 00:00:00'), 3: Timestamp('1946-10-01 00:00:00'), 4: Timestamp('1947-01-01 00:00:00'), 5: Timestamp('1947-04-01 00:00:00'), 6: Timestamp('1947-07-01 00:00:00'), 7: Timestamp('1947-10-01 00:00:00'), 8: Timestamp('1948-01-01 00:00:00'), 9: Timestamp('1948-04-01 00:00:00'), 10: Timestamp('1948-07-01 00:00:00'), 11: Timestamp('1948-10-01 00:00:00'), 12: Timestamp('1949-01-01 00:00:00'), 13: Timestamp('1949-04-01 00:00:00'), 14: Timestamp('1949-07-01 00:00:00'), 15: Timestamp('1949-10-01 00:00:00'), 16: Timestamp('1950-01-01 00:00:00'), 17: Timestamp('1950-04-01 00:00:00'), 18: Timestamp('1950-07-01 00:00:00'), 19: Timestamp('1950-10-01 00:00:00'), 20: Timestamp('1951-01-01 00:00:00'), 21: Timestamp('1951-04-01 00:00:00'), 22: Timestamp('1951-07-01 00:00:00'), 23: Timestamp('1951-10-01 00:00:00'), 24: Timestamp('1952-01-01 00:00:00'), 25: Timestamp('1952-04-01 00:00:00'), 26: Timestamp('1952-07-01 00:00:00'), 27: Timestamp('1952-10-01 00:00:00'), 28: Timestamp('1953-01-01 00:00:00'), 29: Timestamp('1953-04-01 00:00:00'), 30: Timestamp('1953-07-01 00:00:00'), 31: Timestamp('1953-10-01 00:00:00'), 32: Timestamp('1954-01-01 00:00:00'), 33: Timestamp('1954-04-01 00:00:00'), 34: Timestamp('1954-07-01 00:00:00'), 35: Timestamp('1954-10-01 00:00:00'), 36: Timestamp('1955-01-01 00:00:00'), 37: Timestamp('1955-04-01 00:00:00'), 38: Timestamp('1955-07-01 00:00:00'), 39: Timestamp('1955-10-01 00:00:00'), 40: Timestamp('1956-01-01 00:00:00'), 41: Timestamp('1956-04-01 00:00:00'), 42: Timestamp('1956-07-01 00:00:00'), 43: Timestamp('1956-10-01 00:00:00'), 44: Timestamp('1957-01-01 00:00:00'), 45: Timestamp('1957-04-01 00:00:00'), 46: Timestamp('1957-07-01 00:00:00'), 47: Timestamp('1957-10-01 00:00:00'), 48: Timestamp('1958-01-01 00:00:00'), 49: Timestamp('1958-04-01 00:00:00'), 50: Timestamp('1958-07-01 00:00:00'), 51: Timestamp('1958-10-01 00:00:00'), 52: Timestamp('1959-01-01 00:00:00'), 53: Timestamp('1959-04-01 00:00:00'), 54: Timestamp('1959-07-01 00:00:00'), 55: Timestamp('1959-10-01 00:00:00'), 56: Timestamp('1960-01-01 00:00:00'), 57: Timestamp('1960-04-01 00:00:00'), 58: Timestamp('1960-07-01 00:00:00'), 59: Timestamp('1960-10-01 00:00:00'), 60: Timestamp('1961-01-01 00:00:00'), 61: Timestamp('1961-04-01 00:00:00'), 62: Timestamp('1961-07-01 00:00:00'), 63: Timestamp('1961-10-01 00:00:00'), 64: Timestamp('1962-01-01 00:00:00'), 65: Timestamp('1962-04-01 00:00:00'), 66: Timestamp('1962-07-01 00:00:00'), 67: Timestamp('1962-10-01 00:00:00'), 68: Timestamp('1963-01-01 00:00:00'), 69: Timestamp('1963-04-01 00:00:00'), 70: Timestamp('1963-07-01 00:00:00'), 71: Timestamp('1963-10-01 00:00:00'), 72: Timestamp('1964-01-01 00:00:00'), 73: Timestamp('1964-04-01 00:00:00'), 74: Timestamp('1964-07-01 00:00:00'), 75: Timestamp('1964-10-01 00:00:00'), 76: Timestamp('1965-01-01 00:00:00'), 77: Timestamp('1965-04-01 00:00:00'), 78: Timestamp('1965-07-01 00:00:00'), 79: Timestamp('1965-10-01 00:00:00'), 80: Timestamp('1966-01-01 00:00:00'), 81: Timestamp('1966-04-01 00:00:00'), 82: Timestamp('1966-07-01 00:00:00'), 83: Timestamp('1966-10-01 00:00:00'), 84: Timestamp('1967-01-01 00:00:00'), 85: Timestamp('1967-04-01 00:00:00'), 86: Timestamp('1967-07-01 00:00:00'), 87: Timestamp('1967-10-01 00:00:00'), 88: Timestamp('1968-01-01 00:00:00'), 89: Timestamp('1968-04-01 00:00:00'), 90: Timestamp('1968-07-01 00:00:00'), 91: Timestamp('1968-10-01 00:00:00'), 92: Timestamp('1969-01-01 00:00:00'), 93: Timestamp('1969-04-01 00:00:00'), 94: Timestamp('1969-07-01 00:00:00'), 95: Timestamp('1969-10-01 00:00:00'), 96: Timestamp('1970-01-01 00:00:00'), 97: Timestamp('1970-04-01 00:00:00'), 98: Timestamp('1970-07-01 00:00:00'), 99: Timestamp('1970-10-01 00:00:00'), 100: Timestamp('1971-01-01 00:00:00'), 101: Timestamp('1971-04-01 00:00:00'), 102: Timestamp('1971-07-01 00:00:00'), 103: Timestamp('1971-10-01 00:00:00'), 104: Timestamp('1972-01-01 00:00:00'), 105: Timestamp('1972-04-01 00:00:00'), 106: Timestamp('1972-07-01 00:00:00'), 107: Timestamp('1972-10-01 00:00:00'), 108: Timestamp('1973-01-01 00:00:00'), 109: Timestamp('1973-04-01 00:00:00'), 110: Timestamp('1973-07-01 00:00:00'), 111: Timestamp('1973-10-01 00:00:00'), 112: Timestamp('1974-01-01 00:00:00'), 113: Timestamp('1974-04-01 00:00:00'), 114: Timestamp('1974-07-01 00:00:00'), 115: Timestamp('1974-10-01 00:00:00'), 116: Timestamp('1975-01-01 00:00:00'), 117: Timestamp('1975-04-01 00:00:00'), 118: Timestamp('1975-07-01 00:00:00'), 119: Timestamp('1975-10-01 00:00:00'), 120: Timestamp('1976-01-01 00:00:00'), 121: Timestamp('1976-04-01 00:00:00'), 122: Timestamp('1976-07-01 00:00:00'), 123: Timestamp('1976-10-01 00:00:00'), 124: Timestamp('1977-01-01 00:00:00'), 125: Timestamp('1977-04-01 00:00:00'), 126: Timestamp('1977-07-01 00:00:00'), 127: Timestamp('1977-10-01 00:00:00'), 128: Timestamp('1978-01-01 00:00:00'), 129: Timestamp('1978-04-01 00:00:00'), 130: Timestamp('1978-07-01 00:00:00'), 131: Timestamp('1978-10-01 00:00:00'), 132: Timestamp('1979-01-01 00:00:00'), 133: Timestamp('1979-04-01 00:00:00'), 134: Timestamp('1979-07-01 00:00:00'), 135: Timestamp('1979-10-01 00:00:00'), 136: Timestamp('1980-01-01 00:00:00'), 137: Timestamp('1980-04-01 00:00:00'), 138: Timestamp('1980-07-01 00:00:00'), 139: Timestamp('1980-10-01 00:00:00'), 140: Timestamp('1981-01-01 00:00:00'), 141: Timestamp('1981-04-01 00:00:00'), 142: Timestamp('1981-07-01 00:00:00'), 143: Timestamp('1981-10-01 00:00:00'), 144: Timestamp('1982-01-01 00:00:00'), 145: Timestamp('1982-04-01 00:00:00'), 146: Timestamp('1982-07-01 00:00:00'), 147: Timestamp('1982-10-01 00:00:00'), 148: Timestamp('1983-01-01 00:00:00'), 149: Timestamp('1983-04-01 00:00:00'), 150: Timestamp('1983-07-01 00:00:00'), 151: Timestamp('1983-10-01 00:00:00'), 152: Timestamp('1984-01-01 00:00:00'), 153: Timestamp('1984-04-01 00:00:00'), 154: Timestamp('1984-07-01 00:00:00'), 155: Timestamp('1984-10-01 00:00:00'), 156: Timestamp('1985-01-01 00:00:00'), 157: Timestamp('1985-04-01 00:00:00'), 158: Timestamp('1985-07-01 00:00:00'), 159: Timestamp('1985-10-01 00:00:00'), 160: Timestamp('1986-01-01 00:00:00'), 161: Timestamp('1986-04-01 00:00:00'), 162: Timestamp('1986-07-01 00:00:00'), 163: Timestamp('1986-10-01 00:00:00'), 164: Timestamp('1987-01-01 00:00:00'), 165: Timestamp('1987-04-01 00:00:00'), 166: Timestamp('1987-07-01 00:00:00'), 167: Timestamp('1987-10-01 00:00:00'), 168: Timestamp('1988-01-01 00:00:00'), 169: Timestamp('1988-04-01 00:00:00'), 170: Timestamp('1988-07-01 00:00:00'), 171: Timestamp('1988-10-01 00:00:00'), 172: Timestamp('1989-01-01 00:00:00'), 173: Timestamp('1989-04-01 00:00:00'), 174: Timestamp('1989-07-01 00:00:00'), 175: Timestamp('1989-10-01 00:00:00'), 176: Timestamp('1990-01-01 00:00:00'), 177: Timestamp('1990-04-01 00:00:00'), 178: Timestamp('1990-07-01 00:00:00'), 179: Timestamp('1990-10-01 00:00:00'), 180: Timestamp('1991-01-01 00:00:00'), 181: Timestamp('1991-04-01 00:00:00'), 182: Timestamp('1991-07-01 00:00:00'), 183: Timestamp('1991-10-01 00:00:00'), 184: Timestamp('1992-01-01 00:00:00'), 185: Timestamp('1992-04-01 00:00:00'), 186: Timestamp('1992-07-01 00:00:00'), 187: Timestamp('1992-10-01 00:00:00'), 188: Timestamp('1993-01-01 00:00:00'), 189: Timestamp('1993-04-01 00:00:00'), 190: Timestamp('1993-07-01 00:00:00'), 191: Timestamp('1993-10-01 00:00:00'), 192: Timestamp('1994-01-01 00:00:00'), 193: Timestamp('1994-04-01 00:00:00'), 194: Timestamp('1994-07-01 00:00:00'), 195: Timestamp('1994-10-01 00:00:00'), 196: Timestamp('1995-01-01 00:00:00'), 197: Timestamp('1995-04-01 00:00:00'), 198: Timestamp('1995-07-01 00:00:00'), 199: Timestamp('1995-10-01 00:00:00'), 200: Timestamp('1996-01-01 00:00:00'), 201: Timestamp('1996-04-01 00:00:00'), 202: Timestamp('1996-07-01 00:00:00'), 203: Timestamp('1996-10-01 00:00:00'), 204: Timestamp('1997-01-01 00:00:00'), 205: Timestamp('1997-04-01 00:00:00'), 206: Timestamp('1997-07-01 00:00:00'), 207: Timestamp('1997-10-01 00:00:00'), 208: Timestamp('1998-01-01 00:00:00'), 209: Timestamp('1998-04-01 00:00:00'), 210: Timestamp('1998-07-01 00:00:00'), 211: Timestamp('1998-10-01 00:00:00'), 212: Timestamp('1999-01-01 00:00:00'), 213: Timestamp('1999-04-01 00:00:00'), 214: Timestamp('1999-07-01 00:00:00'), 215: Timestamp('1999-10-01 00:00:00'), 216: Timestamp('2000-01-01 00:00:00'), 217: Timestamp('2000-04-01 00:00:00'), 218: Timestamp('2000-07-01 00:00:00'), 219: Timestamp('2000-10-01 00:00:00'), 220: Timestamp('2001-01-01 00:00:00'), 221: Timestamp('2001-04-01 00:00:00'), 222: Timestamp('2001-07-01 00:00:00'), 223: Timestamp('2001-10-01 00:00:00'), 224: Timestamp('2002-01-01 00:00:00'), 225: Timestamp('2002-04-01 00:00:00'), 226: Timestamp('2002-07-01 00:00:00'), 227: Timestamp('2002-10-01 00:00:00'), 228: Timestamp('2003-01-01 00:00:00'), 229: Timestamp('2003-04-01 00:00:00'), 230: Timestamp('2003-07-01 00:00:00'), 231: Timestamp('2003-10-01 00:00:00'), 232: Timestamp('2004-01-01 00:00:00'), 233: Timestamp('2004-04-01 00:00:00'), 234: Timestamp('2004-07-01 00:00:00'), 235: Timestamp('2004-10-01 00:00:00'), 236: Timestamp('2005-01-01 00:00:00'), 237: Timestamp('2005-04-01 00:00:00'), 238: Timestamp('2005-07-01 00:00:00'), 239: Timestamp('2005-10-01 00:00:00'), 240: Timestamp('2006-01-01 00:00:00'), 241: Timestamp('2006-04-01 00:00:00'), 242: Timestamp('2006-07-01 00:00:00'), 243: Timestamp('2006-10-01 00:00:00'), 244: Timestamp('2007-01-01 00:00:00'), 245: Timestamp('2007-04-01 00:00:00'), 246: Timestamp('2007-07-01 00:00:00'), 247: Timestamp('2007-10-01 00:00:00'), 248: Timestamp('2008-01-01 00:00:00'), 249: Timestamp('2008-04-01 00:00:00'), 250: Timestamp('2008-07-01 00:00:00'), 251: Timestamp('2008-10-01 00:00:00'), 252: Timestamp('2009-01-01 00:00:00'), 253: Timestamp('2009-04-01 00:00:00'), 254: Timestamp('2009-07-01 00:00:00'), 255: Timestamp('2009-10-01 00:00:00'), 256: Timestamp('2010-01-01 00:00:00'), 257: Timestamp('2010-04-01 00:00:00'), 258: Timestamp('2010-07-01 00:00:00'), 259: Timestamp('2010-10-01 00:00:00'), 260: Timestamp('2011-01-01 00:00:00'), 261: Timestamp('2011-04-01 00:00:00'), 262: Timestamp('2011-07-01 00:00:00'), 263: Timestamp('2011-10-01 00:00:00'), 264: Timestamp('2012-01-01 00:00:00'), 265: Timestamp('2012-04-01 00:00:00'), 266: Timestamp('2012-07-01 00:00:00'), 267: Timestamp('2012-10-01 00:00:00'), 268: Timestamp('2013-01-01 00:00:00'), 269: Timestamp('2013-04-01 00:00:00'), 270: Timestamp('2013-07-01 00:00:00'), 271: Timestamp('2013-10-01 00:00:00'), 272: Timestamp('2014-01-01 00:00:00'), 273: Timestamp('2014-04-01 00:00:00'), 274: Timestamp('2014-07-01 00:00:00'), 275: Timestamp('2014-10-01 00:00:00'), 276: Timestamp('2015-01-01 00:00:00'), 277: Timestamp('2015-04-01 00:00:00'), 278: Timestamp('2015-07-01 00:00:00'), 279: Timestamp('2015-10-01 00:00:00'), 280: Timestamp('2016-01-01 00:00:00'), 281: Timestamp('2016-04-01 00:00:00'), 282: Timestamp('2016-07-01 00:00:00'), 283: Timestamp('2016-10-01 00:00:00'), 284: Timestamp('2017-01-01 00:00:00'), 285: Timestamp('2017-04-01 00:00:00'), 286: Timestamp('2017-07-01 00:00:00'), 287: Timestamp('2017-10-01 00:00:00'), 288: Timestamp('2018-01-01 00:00:00'), 289: Timestamp('2018-04-01 00:00:00'), 290: Timestamp('2018-07-01 00:00:00'), 291: Timestamp('2018-10-01 00:00:00'), 292: Timestamp('2019-01-01 00:00:00'), 293: Timestamp('2019-04-01 00:00:00'), 294: Timestamp('2019-07-01 00:00:00'), 295: Timestamp('2019-10-01 00:00:00'), 296: Timestamp('2020-01-01 00:00:00'), 297: Timestamp('2020-04-01 00:00:00'), 298: Timestamp('2020-07-01 00:00:00'), 299: Timestamp('2020-10-01 00:00:00'), 300: Timestamp('2021-01-01 00:00:00'), 301: Timestamp('2021-04-01 00:00:00'), 302: Timestamp('2021-07-01 00:00:00')}, 'Gross Domestic Product': {0: nan, 1: nan, 2: nan, 3: nan, 4: 243.164, 5: 245.968, 6: 249.585, 7: 259.745, 8: 265.742, 9: 272.567, 10: 279.196, 11: 280.366, 12: 275.034, 13: 271.351, 14: 272.889, 15: 270.627, 16: 280.828, 17: 290.383, 18: 308.153, 19: 319.945, 20: 336.0, 21: 344.09, 22: 351.385, 23: 356.178, 24: 359.82, 25: 361.03, 26: 367.701, 27: 380.812, 28: 387.98, 29: 391.749, 30: 391.171, 31: 385.97, 32: 385.345, 33: 386.121, 34: 390.996, 35: 399.734, 36: 413.073, 37: 421.532, 38: 430.221, 39: 437.092, 40: 439.746, 41: 446.01, 42: 451.191, 43: 460.463, 44: 469.779, 45: 472.025, 46: 479.49, 47: 474.864, 48: 467.54, 49: 471.978, 50: 485.841, 51: 499.555, 52: 510.33, 53: 522.653, 54: 525.034, 55: 528.6, 56: 542.648, 57: 541.08, 58: 545.604, 59: 540.197, 60: 545.018, 61: 555.545, 62: 567.664, 63: 580.612, 64: 594.013, 65: 600.366, 66: 609.027, 67: 612.28, 68: 621.672, 69: 629.752, 70: 644.444, 71: 653.938, 72: 669.822, 73: 678.674, 74: 692.031, 75: 697.319, 76: 717.79, 77: 730.191, 78: 749.323, 79: 771.857, 80: 795.734, 81: 804.981, 82: 819.638, 83: 833.302, 84: 844.17, 85: 848.983, 86: 865.233, 87: 881.439, 88: 909.387, 89: 934.344, 90: 950.825, 91: 968.03, 92: 993.337, 93: 1009.02, 94: 1029.956, 95: 1038.147, 96: 1051.2, 97: 1067.375, 98: 1086.059, 99: 1088.608, 100: 1135.156, 101: 1156.271, 102: 1177.675, 103: 1190.297, 104: 1230.609, 105: 1266.369, 106: 1290.566, 107: 1328.904, 108: 1377.49, 109: 1413.887, 110: 1433.838, 111: 1476.289, 112: 1491.209, 113: 1530.056, 114: 1560.026, 115: 1599.679, 116: 1616.116, 117: 1651.853, 118: 1709.82, 119: 1761.831, 120: 1820.487, 121: 1852.332, 122: 1886.558, 123: 1934.273, 124: 1988.648, 125: 2055.909, 126: 2118.473, 127: 2164.27, 128: 2202.76, 129: 2331.633, 130: 2395.053, 131: 2476.949, 132: 2526.61, 133: 2591.247, 134: 2667.565, 135: 2723.883, 136: 2789.842, 137: 2797.352, 138: 2856.483, 139: 2985.557, 140: 3124.206, 141: 3162.532, 142: 3260.609, 143: 3280.818, 144: 3274.302, 145: 3331.972, 146: 3366.322, 147: 3402.561, 148: 3473.413, 149: 3578.848, 150: 3689.179, 151: 3794.706, 152: 3908.054, 153: 4009.601, 154: 4084.25, 155: 4148.551, 156: 4230.168, 157: 4294.887, 158: 4386.773, 159: 4444.094, 160: 4507.894, 161: 4545.34, 162: 4607.669, 163: 4657.627, 164: 4722.156, 165: 4806.16, 166: 4884.555, 167: 5007.994, 168: 5073.372, 169: 5190.036, 170: 5282.835, 171: 5399.509, 172: 5511.253, 173: 5612.463, 174: 5695.365, 175: 5747.237, 176: 5872.701, 177: 5960.028, 178: 6015.116, 179: 6004.733, 180: 6035.178, 181: 6126.862, 182: 6205.937, 183: 6264.54, 184: 6363.102, 185: 6470.763, 186: 6566.641, 187: 6680.803, 188: 6729.459, 189: 6808.939, 190: 6882.098, 191: 7013.738, 192: 7115.652, 193: 7246.931, 194: 7331.075, 195: 7455.288, 196: 7522.289, 197: 7580.997, 198: 7683.125, 199: 7772.586, 200: 7868.468, 201: 8032.84, 202: 8131.408, 203: 8259.771, 204: 8362.655, 205: 8518.825, 206: 8662.823, 207: 8765.907, 208: 8866.48, 209: 8969.699, 210: 9121.097, 211: 9293.991, 212: 9411.682, 213: 9526.21, 214: 9686.626, 215: 9900.169, 216: 10002.179, 217: 10247.72, 218: 10318.165, 219: 10435.744, 220: 10470.231, 221: 10599.0, 222: 10598.02, 223: 10660.465, 224: 10783.5, 225: 10887.46, 226: 10984.04, 227: 11061.433, 228: 11174.129, 229: 11312.766, 230: 11566.669, 231: 11772.234, 232: 11923.447, 233: 12112.815, 234: 12305.307, 235: 12527.214, 236: 12767.286, 237: 12922.656, 238: 13142.642, 239: 13324.204, 240: 13599.16, 241: 13753.424, 242: 13870.188, 243: 14039.56, 244: 14215.651, 245: 14402.082, 246: 14564.117, 247: 14715.058, 248: 14706.538, 249: 14865.701, 250: 14898.999, 251: 14608.208, 252: 14430.901, 253: 14381.236, 254: 14448.882, 255: 14651.248, 256: 14764.611, 257: 14980.193, 258: 15141.605, 259: 15309.471, 260: 15351.444, 261: 15557.535, 262: 15647.681, 263: 15842.267, 264: 16068.824, 265: 16207.13, 266: 16319.54, 267: 16420.386, 268: 16629.05, 269: 16699.551, 270: 16911.068, 271: 17133.114, 272: 17144.281, 273: 17462.703, 274: 17743.227, 275: 17852.54, 276: 17991.348, 277: 18193.707, 278: 18306.96, 279: 18332.079, 280: 18425.306, 281: 18611.617, 282: 18775.459, 283: 18968.041, 284: 19153.912, 285: 19322.92, 286: 19558.693, 287: 19882.965, 288: 20143.716, 289: 20492.492, 290: 20659.102, 291: 20813.325, 292: 21001.591, 293: 21289.268, 294: 21505.012, 295: 21694.458, 296: 21481.367, 297: 19477.444, 298: 21138.574, 299: 21477.597, 300: 22038.226, 301: 22740.959, 302: 23202.344}}
df = pd.DataFrame(data_dict)
As I loop, I visit small subsets like df.loc[(df['Date'] >= "2019") & (df['Date'] <= "2021")].
CodePudding user response:
I'll answer my own question to put the matter to rest. The answer is based on a suggestion by MrFuppes, a gentleman.
To regain control over tick location and tick label formatting, when using the pandas plot wrapper, one needs to set x_compat=True. This is because the pandas wrapper does a lot of work in the background with locators and formatters. In most cases, pandas does a great job, but if you want more idiosyncratic control, you need to access matplotlib's locators and formatters. Below is one way to achieve the desired result.
from matplotlib.dates import YearLocator, DateFormatter
f, ax = plt.subplots()
df.plot(ax=ax, x='Date', x_compat=True)
ax.xaxis.set_major_locator(YearLocator(10))
ax.xaxis.set_major_formatter(DateFormatter("%Y"))
ax.xaxis.set_tick_params(rotation=0)
plt.show()
If the time horizon were shorter, a possible customization (not terribly different from the pandas default) is the following:
from matplotlib.dates import YearLocator, MonthLocator, DateFormatter
f, ax = plt.subplots()
df.plot(ax=ax, x='Date', x_compat=True)
ax.xaxis.set_major_locator(YearLocator(1))
ax.xaxis.set_major_formatter(DateFormatter("%b\n%Y"))
ax.xaxis.set_tick_params(rotation=0)
ax.xaxis.set_minor_locator(MonthLocator(7))
ax.xaxis.set_minor_formatter(DateFormatter("%b"))
ax.xaxis.set_label_text('')
plt.show()
I have also had some success adding thousand separators to the y axis with:
from matplotlib.ticker import FuncFormatter
ax.yaxis.set_minor_formatter(FuncFormatter(lambda x, pos: format(int(x), ',')))
or .set_major_formatter as the case may be.
but that is now clearly off topic.





