不足之处:
- 程序太长,函数缺少,不好调用
- 注释太少
错位折线图
# -*- coding: utf-8 -*-
"""
Created on Wed May 11 09:55:51 2022
目标:绘制多曲线x轴错位,比较图
实现
①底色填充
②“自定义”图例
③去除边框
④设置绘图界面大小
⑤字典设置
⑥定义画图区间
@author: hp
"""
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
workbook = pd.read_excel(r"E:\a毕业设计\3-程序\6-耦合协调度.xlsx",encoding = "gbk", index_col = "年份")
plt.rcParams['font.sans-serif'] = ['SimHei']
provines = list(workbook)
rank = workbook.index[-2]
#core = ['s','*','+','h','.','x']
core = ['#f47920','#f05b72','#2a5caa','#840228','#b7704f','k']
areas = ['东北','华北','西北','东南','西南','华中']
labels = dict(zip(areas,core))
k = 0
#%%----------单独绘制图例---------------
for m in areas:
plt.plot(0,0,label = m,color = labels[m], linestyle = "--", marker='.') #设置绘图曲线参数
k = + 1
#%%-----------绘制31个省份的折线图--------------------------
font = {'family':'SimHei',"color": labels[area1],'weight':'normal','size':16}
for i in provines:
x = workbook.index[:-2] + workbook[i][rank]*10
y = workbook[i][:-2]
area1 = workbook[i]["片区"]
plt.plot(x,y,color = labels[area1], linestyle = "--", marker='.')
plt.xticks([])
plt.xlim(2010.5,2335.5) #限制绘图区域
plt.ylim(0.53,0.8)
plt.ylabel("D", fontsize = 13)
#以下是标注文字
yy = y.iloc[-1]
xx = list(x)[-5]
plt.text(xx, yy+0.006, i, fontdict = font)
#%%--------------填充底色---------------------
plt.fill_between(np.arange(2000,2390),0.6,0.7,color="r",alpha = .1, linewidth=0.1)
plt.fill_between(np.arange(2000,2390),0.7,0.8,color="g",alpha = .2, linewidth=0)
plt.fill_between(np.arange(2000,2390),0.5,0.6,color="g",alpha = .1, linewidth=0)
plt.text(2020,0.54,'勉强耦合协调', fontsize=15, color='k')
plt.text(2020,0.67,'初级耦合协调', fontsize=15, color='k')
plt.text(2020,0.75,'中级耦合协调', fontsize=15, color='k')
plt.legend(loc='best', frameon=False, ncol=12, fontsize = 16.5)
#获取当前图表属性
ax=plt.gca() #超级有用,相比用subplots才能得到ax,plt这个对单个图来说太友好了
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
#修改图表边缘大小,删除百边
plt.subplots_adjust(top=0.96,
bottom=0.005,
left=0.045,
right=0.98,
hspace=0.2,
wspace=0.2)
柱状图+折线图(共轴)(删除特定区域)
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 28 10:10:57 2022
绘制耦合协调度的程序
@author: hp
"""
# -*- coding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
workbook=pd.read_excel(r"E:\a毕业设计\3-程序\subsystems_levels.xlsx",encoding='gbk',index_col='省份')
provins = ['辽宁','吉林','黑龙江','上海','浙江','江苏','广东','福建','海南','北京','天津','山东','山西','河北','河南','安徽','江西','湖南','湖北','内蒙古','宁夏','青海','陕西','甘肃','新疆','重庆','贵州','广西','云南','四川','西藏']
plt.rcParams['font.sans-serif']=['SimHei']
fig, axes = plt.subplots(nrows=6, ncols=6, sharex = 'all', sharey = 'all' )
fig.delaxes(axes[0,3])
fig.delaxes(axes[0,4])
fig.delaxes(axes[0,5])
fig.delaxes(axes[3,4])
fig.delaxes(axes[3,5])
yy = np.zeros([11,12])
for i in range(11):
yy[i:] = np.zeros(12)+i*0.1
xx = np.arange(2010,2022)
pic = [3,6,6,4,6,6] #便于定位换行
k = -1
alph = .3
for i in range(36):
m = int(i/6) #表示第几行
n = (i+1)%6 #表示第几列
if n == 0:
j = 6
else:
j = n #判断边界
if j <= pic[m]: #表示可以绘制
k = k + 1
provins_name = provins[k]
workbook2 = workbook.loc[provins_name]
#%% 绘制折线图和颜色背景
y=workbook2["D"]
x = workbook2["年份"]
ax = axes[m,j-1]
ax.fill_between(xx, yy[0], yy[1], alpha=alph, linewidth=0)
ax.fill_between(xx, yy[1], yy[2], alpha=alph, linewidth=0)
ax.fill_between(xx, yy[2], yy[3], alpha=alph, linewidth=0)
ax.fill_between(xx, yy[3], yy[4], alpha=alph, linewidth=0)
ax.fill_between(xx, yy[4], yy[5], alpha=alph, linewidth=1)
ax.fill_between(xx, yy[5], yy[6], alpha=alph, linewidth=0)
ax.fill_between(xx, yy[6], yy[7], alpha=alph, linewidth=0)
ax.fill_between(xx, yy[7], yy[8], alpha=alph, linewidth=0)
ax.fill_between(xx, yy[8], yy[9], alpha=alph, linewidth=0)
ax.fill_between(xx, yy[9], yy[10],alpha=alph, linewidth=0)
#%% 绘制柱状图
y_bar1 = workbook2["Uw"]
y_bar2 = workbook2["Us"]
y_bar3 = workbook2["Ue"]
bar_width=0.25
ax.bar(x-bar_width,y_bar1,bar_width,color="#3CC4A9",label="Uw")
ax.bar(x,y_bar2,bar_width,align="center",color="#614DB3",label='Us')
ax.bar(x+bar_width,y_bar3,bar_width,color='#FF4500',label='Ue')
ax.set_xticks(np.arange(2011,2021,1))
ax.set_title(provins_name,fontsize = 15)
#ax.set_xlabel("年份",fontsize=9)
#ax.set_ylabel("数值",fontsize=9)
ax.plot(x,y,'k-',label="耦合协调度D")
ax.spines['right'].set_visible(False) # 去掉边框
ax.spines['top'].set_visible(False) # 去掉边框
#plt.subplots_adjust(wspace=0.3,hspace=0.7)
plt.legend(loc='upper right', frameon=False, ncol=4)
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
plt.ylim(0.2,0.8)
plt.xlim(2010.5,2020.5)
plt.xticks(fontsize = 12)
plt.yticks(fontsize = 12)
plt.subplots_adjust(top=0.962,
bottom=0.037,
left=0.025,
right=0.992,
hspace=0.291,
wspace=0.015)
plt.show()
# if j==3 and m==0 :
# ax.legend(loc='upper right', frameon=False, ncol=4)
# make data
#plt.legend()
折线图(共轴)
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 30 09:28:53 2022
绘制折线图
共轴
@author: hp
"""
# -*- coding: utf-8 -*-
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
name = 'Us'
np.random.seed(1)
workbook=pd.read_excel(r"E:\a毕业设计\3-程序\2-subsystems_level.xlsx",encoding='gbk',index_col='省份')
#areas = list(set(workbook.index))
areas = ['西北','华北','东北','西南','华中','东南']
plt.rcParams['font.sans-serif']=['SimHei']
fig, axes = plt.subplots(nrows=2, ncols=3, sharex = 'all', sharey = 'all')
alph = .3
for i in range(6):
k = i+1
m = int(i/3)
n = (i+1)%3
if n == 0:
j = 3
else:
j = n
ax = axes[m,j-1]
workbook2 = workbook.loc[areas[i]]
#print(areas[i])
area_provins = list(set(workbook2["省份"]))
n = np.size(area_provins)
workbook2.index = workbook2["省份"]
# singel area
for b in range(n):
workbook3 = workbook2.loc[area_provins[b]]
#%% 绘制折线图
y=workbook3[name]
x = workbook3["年份"]
ax.plot(x,y,'*-',label=area_provins[b])
if m == 1:
ax.set_xlabel("年份",fontsize=9)
if j-1 == 0:
ax.set_ylabel(name + " 数值",fontsize=9)
#if j-1 == 2:
# ax1 = ax.twinx()
#%% 调整绘图参数
#ax.spines['right'].set_visible(False) # 去掉边框
#ax.spines['top'].set_v0isible(False) # 去掉边框
# 设置副刻度线
ax.set_title('('+str(i+1)+') '+areas[i])
ax.legend(loc='upper left', frameon=False, ncol=5)
ymajorLocator = MultipleLocator(1)
ax.yaxis.set_major_locator(ymajorLocator)
yminorLocator = MultipleLocator(0.025)
ax.yaxis.set_minor_locator(yminorLocator)
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
plt.ylim(0.15,0.85,0.05)
plt.yticks(np.arange(0.2,0.85,0.05))
plt.xticks(np.arange(2010,2021,1))
plt.xlim(2010.5,2020.5)
plt.subplots_adjust(top=0.969,
bottom=0.067,
left=0.064,
right=0.944,
hspace=0.00,
wspace=0)
plt.show()
# make data
#plt.legend()
重叠柱状图
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 15 19:28:37 2021
@author: hp
"""
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
workbook1=pd.read_excel(r"E:\a毕业设计\4-开始写论文了\2-图\multi_bar.xlsx",encoding='gbk',index_col='省份')
x = workbook1.index
index_name = list(workbook1)
plt.rcParams['font.sans-serif'] = ['SimHei']
font=11
num = [3,4,3]
k = 0
for j in range(3):
n = num[j]
fig, axs = plt.subplots(nrows = n, ncols = 1, sharex = 'all', figsize=(10,1.5*n))
for i in range(n):
y1=workbook1[index_name[k]]
y2=workbook1[index_name[k+1]]
y3=workbook1[index_name[k+2]]
print(index_name[k],index_name[k+1],index_name[k+2])
ax = axs[i]
bar_width=0.25
plt.rcParams['xtick.direction'] = 'in'
plt.subplots_adjust(left=None,bottom=None,right=None,top=None)
plt.subplots_adjust(wspace=0.3,hspace=0.7)
ax.bar(x,y1,bar_width,color="w",alpha=1,edgecolor='red',linewidth=1.5,label="2010年")
ax.bar(x,y2,bar_width,align="center",color="w",alpha=0.6,edgecolor='black',linewidth=1.5,label='2016年')
ax.bar(x,y3,bar_width,color='w',alpha=0.4,edgecolor='blue',linewidth=1.5,label='2020年')
ax.plot(x,y1,'red',alpha = 0.5)
ax.plot(x,y2,'black',alpha = 0.5)
ax.plot(x,y3,'blue',alpha = 0.5)
plt.xticks(size=font,rotation = 290)
plt.yticks(fontproperties = 'Times New Roman', size=font)
plt.tick_params(bottom=False,top=False,left=True,right=False)
ax.set_ylabel(index_name[k][:-1]+'得分', size=font)
print(index_name[k][:-1])
plt.subplots_adjust(top=0.915,
bottom=0.18,
left=0.075,
right=0.97,
hspace=0.0,
wspace=0.3)
if i == 0:
ax.legend(loc='best', frameon=False, ncol=font, prop = {'size':font-1.5})
k = k + 3
print(j,k)