Python绘图:如何将xticks调整为每4年显示一次的间隔
热带气旋时序图X轴刻度调整方案
我有1960-2020年的热带气旋数据,需绘制时序图:FRQ为柱状图,FILT为折线图。当前代码可生成图表,但无法将X轴刻度调整为每4年显示一次,使用Jupyter Notebook开发,求解决方案。
数据示例
YEAR FRQ FILT 1960 1 1961 3 1962 1 1.416666667 1963 1 0.916666667 1964 0 0.833333333 1965 1 1.333333333 1966 3 1.75 1967 2 1.5 1968 0 0.833333333 1969 0 0.666666667 1970 1 1.166666667 1971 3 1.666666667 1972 1 1.833333333 1973 2 1.75 1974 2 1.5 1975 1 1 1976 0 0.5 1977 0 0.416666667 1978 1 0.833333333 1979 1 1.333333333 1980 3 1.5 1981 0 1.333333333 1982 2 1 1983 0 0.833333333 1984 1 0.75 1985 1 0.583333333 1986 0 0.5 1987 0 0.75 1988 2 1.166666667 1989 2 1.25 1990 0 0.916666667 1991 1 0.833333333 1992 0 1.25 1993 4 1.5 1994 0 1.416666667 1995 1 1.25 1996 2 1.416666667 1997 1 1.833333333 1998 3 2 1999 2 1.75 2000 1 1.166666667 2001 0 1.083333333 2002 1 1.666666667 2003 5 2 2004 0 1.75 2005 1 1.5 2006 2 1.75 2007 3 2.166666667 2008 1 2.333333333 2009 4 2.333333333 2010 1 2.25 2011 3 1.916666667 2012 1 1.5 2013 1 1.166666667 2014 1 0.916666667 2015 1 0.75 2016 0 0.666666667 2017 1 0.75 2018 1 0.833333333 2019 1 2020 0
当前运行代码
#Read Tropical cyclone frequency TC = pd.read_csv (r'G:\TC_Atlas\\data.csv', encoding="ISO-8859-1") TC = pd.DataFrame(TC,columns=['YEAR','FRQ','FILT','FRQ2','FILT2','LMI','FILTLMI','LMI2','FILTLMI2']) TC= TC[TC['YEAR'].between(1960,2020,inclusive="both")] #TC = TC.set_index('YEAR') labels =['1960','1961','1962','1963','1964','1965','1966','1967','1968','1969','1970','1971','1972','1973','1974','1975', '1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992', '1993','1994','1995','1996','1997','1998','1999','2000','2001','2002','2003','2004','2005','2006','2007','2008','2009', '2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020'] #Plot timeseries TC['FRQ'].plot(kind='bar', color='lightgray', width=1, edgecolor='darkgray') TC['FILT'].plot(kind='line',color='black') plt.suptitle("TC Passage Frequency",fontweight='bold',y=0.95,x=0.53) plt.title("Isabela (1960-2020)", pad=0) L=plt.legend() L.get_texts()[0].set_text('filtered') plt.yticks(fontsize=12) tickvalues = range(0,len(labels)) plt.xticks(ticks = tickvalues ,labels = labels, rotation = 30) plt.xlabel('Year', color='black', fontsize=14, weight='bold',labelpad=10) plt.ylabel('Frequency' , color='black', fontsize=14, weight='bold',labelpad=15) plt.tight_layout() plt.show()
解决方案
核心是只保留每4年的刻度标签,其余年份隐藏,同时保证刻度和数据对齐。以下是修改后的完整代码:
import pandas as pd import matplotlib.pyplot as plt # 读取热带气旋频率数据 TC = pd.read_csv(r'G:\TC_Atlas\\data.csv', encoding="ISO-8859-1") # 只保留需要的列,简化数据结构 TC = TC[['YEAR','FRQ','FILT']] TC = TC[TC['YEAR'].between(1960,2020,inclusive="both")] # 绘制时序图:FRQ柱状图,FILT折线图 TC['FRQ'].plot(kind='bar', color='lightgray', width=1, edgecolor='darkgray') TC['FILT'].plot(kind='line', color='black') # 设置标题 plt.suptitle("TC Passage Frequency", fontweight='bold', y=0.95, x=0.53) plt.title("Isabela (1960-2020)", pad=0) # 调整图例显示 L = plt.legend() L.get_texts()[0].set_text('filtered') # 设置Y轴刻度字体大小 plt.yticks(fontsize=12) # 关键:设置每4年显示一次的X轴刻度 years = TC['YEAR'].tolist() # 筛选出1960开始每4年的年份 tick_years = [year for year in years if year % 4 == 0] # 获取这些年份在数据中的索引位置 tick_positions = [years.index(year) for year in tick_years] # 应用刻度:仅在指定位置显示对应年份标签 plt.xticks(ticks=tick_positions, labels=tick_years, rotation=30) # 设置坐标轴标签 plt.xlabel('Year', color='black', fontsize=14, weight='bold', labelpad=10) plt.ylabel('Frequency', color='black', fontsize=14, weight='bold', labelpad=15) plt.tight_layout() plt.show()
关键修改点说明
- 移除了手动维护的
labels列表,直接从数据中提取年份,避免手动输入错误 - 通过
year % 4 == 0筛选每4年的年份,确保间隔准确 - 用
years.index(year)获取对应数据索引,保证刻度和柱状图位置完全对齐 - 仅给筛选后的位置设置标签,其余年份自动隐藏,解决刻度重叠问题
内容的提问来源于stack exchange,提问作者user2543
相关产品推荐
相关产品推荐

