1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > python读取excel数据并用双y轴绘制柱状图和折线图 柱子用渐变颜色填充

python读取excel数据并用双y轴绘制柱状图和折线图 柱子用渐变颜色填充

时间:2018-05-04 15:53:04

相关推荐

python读取excel数据并用双y轴绘制柱状图和折线图 柱子用渐变颜色填充

python绘图系列文章目录

往期python绘图合集:

python绘制简单的折线图

python读取excel中数据并绘制多子图多组图在一张画布上

python绘制带误差棒的柱状图

python绘制多子图并单独显示

python读取excel数据并绘制多y轴图像

python绘制柱状图并美化|不同颜色填充柱子

python随机生成数据并用双y轴绘制两条带误差棒的折线图

Python绘制带误差棒的柱状图渐变色填充含数据标注(进阶)

python绘制散点图|散点大小和颜色深浅由数值决定

Matplotlib绘制漂亮的饼状图|python绘制漂亮的饼状图

本文目录

python绘图系列文章目录一、 数据准备二、增加y轴三、准备颜色渐变3.1 准备颜色渐变3.2 美化图3.3给折线图增添数据3.4 调柱状图增加数据 四、完成代码六 运行结果

一、 数据准备

通过 Pandas 的 read_excel() 函数读取了 Excel 文件,将其转为了数据框格式,并设置字体字号,画布大小。

import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport matplotlibexcel = pd.read_excel("C:/Users/ypzhao/Desktop/新能源汽车数据.xlsx")data = pd.DataFrame(excel)# 生成随机数据x = data['年份']y1 = data['销量']y2 = data['增长率']# 设置字体和字号matplotlib.rcParams['font.family'] = 'Times New Roman'matplotlib.rcParams['font.size'] = 24font = {'family':'Times New Roman','size':28}# 创建画布和子图fig, ax1 = plt.subplots(figsize=(11,6),dpi=3000)

二、增加y轴

使用 ax1.bar() 函数绘制柱状图,ax2.plot() 函数绘制折线图,设置坐标轴标签和标题,并设置坐标轴字体和字号。

# 设置字体和字号matplotlib.rcParams['font.family'] = 'Times New Roman'matplotlib.rcParams['font.size'] = 24font = {'family':'Times New Roman','size':28}# 创建画布和子图fig, ax1 = plt.subplots(figsize=(11,6),dpi=3000)ax2 = ax1.twinx()

三、准备颜色渐变

3.1 准备颜色渐变

n_groups = 6cmap = plt.get_cmap('coolwarm')colors_1 = [cmap(i) for i in np.linspace(0, 0.8, n_groups)]# 绘制图#绘制折线图bar_plot=ax1.bar(x, y1, color=colors_1)#绘制柱状图ax2.plot(x, y2, color='green',marker='*',markersize=10)

3.2 美化图

# 设置坐标轴标签和标题ax1.set_xlabel('年份',fontname='SimSun')ax2.set_ylabel('增长率/%', color='#3F7F4C',fontname='SimSun')ax1.set_ylabel('销量/万辆', color='#6D8F18',fontname='SimSun')# 设置坐标轴字体和字号for ax in [ax1, ax2]:ax.tick_params(axis='both', which='major', labelsize=20)for tick in ax.get_xticklabels() + ax.get_yticklabels():tick.set_fontname('Times New Roman')# 设置坐标轴标签和标题ax1.set_xlabel('年份',fontname='SimSun')ax2.set_ylabel('增长率/%', color='#3F7F4C',fontname='SimSun')ax1.set_ylabel('销量/万辆', color='#6D8F18',fontname='SimSun')# 设置坐标轴字体和字号for ax in [ax1, ax2]:ax.tick_params(axis='both', which='major', labelsize=20)for tick in ax.get_xticklabels() + ax.get_yticklabels():tick.set_fontname('Times New Roman')# 设置网格线不可见ax1.grid(visible=False)ax2.grid(visible=False)ax2.set_ylim(-45,390)ax1.set_ylim(0,730)# 设置双坐标轴的颜色不一致ax1.spines['left'].set_color('#6D8F18')ax1.spines['right'].set_color('#3F7F4C')ax1.tick_params(axis='y', colors='#6D8F18')ax2.tick_params(axis='y', colors='#3F7F4C')ax1.grid(visible=False)ax2.grid(visible=False)ax2.set_ylim(-45,390)ax1.set_ylim(0,730)# 设置双坐标轴的颜色不一致ax1.spines['left'].set_color('#6D8F18')ax1.spines['right'].set_color('#3F7F4C')ax1.tick_params(axis='y', colors='#6D8F18')ax2.tick_params(axis='y', colors='#3F7F4C')

3.3给折线图增添数据

for i, j in zip(x, y2):ax.annotate('{:.2f}'.format(j), xy=(i, j), xytext=(-10, 10),textcoords='offset points', fontsize=16)

3.4 调柱状图增加数据

for rect in bar_plot:height = rect.get_height()ax1.text(rect.get_x() + rect.get_width()/2., height+1, '%.1f' % (height),ha='center', va='bottom', fontsize=16, color='blue',fontname='Times New Roman') # 字体颜色蓝色# 自动调整布局plt.tight_layout()

使用 rect.get_x() + rect.get_width()/2. 表示标签文本的位置,在柱形中心正上方;使用 rect.get_height()+0.5 表示标签文本的高度,在柱形顶端上方略微偏移;ha 和 va 参数分别用于设置文本标签的水平和垂直对齐方式。最后,f’{y[i]}’ 表示标签文本内容,即柱形高度。

四、完成代码

# -*- coding: utf-8 -*-"""Created on Sat May 20 17:55:37 @author: ypzhao"""import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport matplotlibexcel = pd.read_excel("C:/Users/ypzhao/Desktop/新能源汽车数据.xlsx")data = pd.DataFrame(excel)# 生成随机数据x = data['年份']y1 = data['销量']y2 = data['增长率']# 设置字体和字号matplotlib.rcParams['font.family'] = 'Times New Roman'matplotlib.rcParams['font.size'] = 24font = {'family':'Times New Roman','size':28}# 创建画布和子图fig, ax1 = plt.subplots(figsize=(11,6),dpi=3000)ax2 = ax1.twinx()# 准备颜色渐变n_groups = 6cmap = plt.get_cmap('coolwarm')colors_1 = [cmap(i) for i in np.linspace(0, 0.8, n_groups)]# 绘制图bar_plot=ax1.bar(x, y1, color=colors_1)# 调整字体颜色、柱子宽度等其他参数ax2.plot(x, y2, color='green',marker='*',markersize=10)# 设置坐标轴标签和标题ax1.set_xlabel('年份',fontname='SimSun')ax2.set_ylabel('增长率/%', color='#3F7F4C',fontname='SimSun')ax1.set_ylabel('销量/万辆', color='#6D8F18',fontname='SimSun')# 设置坐标轴字体和字号for ax in [ax1, ax2]:ax.tick_params(axis='both', which='major', labelsize=20)for tick in ax.get_xticklabels() + ax.get_yticklabels():tick.set_fontname('Times New Roman')# 设置网格线不可见ax1.grid(visible=False)ax2.grid(visible=False)ax2.set_ylim(-45,390)ax1.set_ylim(0,730)# 设置双坐标轴的颜色不一致ax1.spines['left'].set_color('#6D8F18')ax1.spines['right'].set_color('#3F7F4C')ax1.tick_params(axis='y', colors='#6D8F18')ax2.tick_params(axis='y', colors='#3F7F4C')# 给折线图增添数据for i, j in zip(x, y2):ax.annotate('{:.2f}'.format(j), xy=(i, j), xytext=(-10, 10),textcoords='offset points', fontsize=16)# 调柱状图增加数据for rect in bar_plot:height = rect.get_height()ax1.text(rect.get_x() + rect.get_width()/2., height+1, '%.1f' % (height),ha='center', va='bottom', fontsize=16, color='blue',fontname='Times New Roman') # 字体颜色蓝色# 自动调整布局plt.tight_layout()plt.savefig("sells.jpg",dpi=3000)

六 运行结果

本文涉及数据链接及代码(点击获取数据):

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。