一、数据源
二、实现的代码
#导入库
import pandas as pd
import matplotlib.pyplot as plt
#自定义函数
def plot_combination():
sale = pd.read_excel('./人均教育支出.xlsx', header=0, index_col=0)
# 设置正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False
# 设置字体大小
plt.rcParams.update({'font.size': 16})
# 提取数据
x = sale['年份']
y1 = sale['城镇']
y2 = sale['农村']
y3= sale['占比']
plt.figure(figsize=(16, 8))
plt.subplot(111)
# 柱形宽度
bar_width = 0.35
# 在主坐标轴绘制柱形图
plt.bar(x, y1, bar_width,color='r', label='城镇')
plt.bar(x + bar_width, y2, bar_width,color='#FFFF00', label='农村')
# 设置坐标轴的取值范围,避免柱子过高而与图例重叠
plt.ylim(0, max(y1.max(), y2.max()) * 1.2)
# 设置图例
plt.legend(loc='upper left')
plt.ylabel("单位:元",fontsize=20, loc="center")
# 设置横坐标的标签
plt.xticks(x)
#plt.set_xticklabels(sale.index)
plt.xlabel("年份",fontsize=20, loc="center")
# 在次坐标轴上绘制折线图
plt.twinx()
# ls:线的类型,lw:宽度
plt.plot(x, y3, ls='--', lw=2, color='c', marker='d',ms = 20, mfc = 'm', label='农村与城镇的消费占比')
# 设置次坐标轴的取值范围,避免折线图波动过大,这里默认显示
plt.ylim()
# 设置图例
plt.legend(loc='upper center')
# 定义显示百分号的函数
def to_percent(number, position=0):
return '%.f' % (number*100) + '%'
# 次坐标轴的标签显示百分号 FuncFormatter:自定义格式函数包
from matplotlib.ticker import FuncFormatter
plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percent))
# 设置标题
plt.title('\n人均教育支出占比\n', fontsize=26, loc='center', color='k')
plt.ylabel("单位:%",fontsize=20, loc="center")
#保存图片
plt.savefig('./figure.jpg', bbox_inches='tight')
plt.show()
if __name__ == '__main__':
plot_combination()
三、结果展示
四、拓展知识
1.绘图标记
marker 可以定义的符号如下:
标记 | 符号 | 描述 |
---|---|---|
"." | | 点 |
"," | | 像素点 |
"o" | | 实心圆 |
"v" | | 下三角 |
"^" | | 上三角 |
"<" | | 左三角 |
">" | | 右三角 |
"1" | | 下三叉 |
"2" | | 上三叉 |
"3" | | 左三叉 |
"4" | | 右三叉 |
"8" | | 八角形 |
"s" | | 正方形 |
"p" | | 五边形 |
"P" | | 加号(填充) |
"*" | | 星号 |
"h" | | 六边形 1 |
"H" | | 六边形 2 |
"+" | | 加号 |
"x" | | 乘号 x |
"X" | | 乘号 x (填充) |
"D" | | 菱形 |
"d" | | 瘦菱形 |
"|" | | 竖线 |
"_" | | 横线 |
0 (TICKLEFT) | | 左横线 |
1 (TICKRIGHT) | | 右横线 |
2 (TICKUP) | | 上竖线 |
3 (TICKDOWN) | | 下竖线 |
4 (CARETLEFT) | | 左箭头 |
5 (CARETRIGHT) | | 右箭头 |
6 (CARETUP) | | 上箭头 |
7 (CARETDOWN) | | 下箭头 |
8 (CARETLEFTBASE) | | 左箭头 (中间点为基准) |
9 (CARETRIGHTBASE) | | 右箭头 (中间点为基准) |
10 (CARETUPBASE) | | 上箭头 (中间点为基准) |
11 (CARETDOWNBASE) | | 下箭头 (中间点为基准) |
"None", " " or "" | 没有任何标记 | |
'$...$' | | 渲染指定的字符。例如 "$f$" 以字母 f 为标记。 |
1.2线类型:
线类型标记 | 描述 | |
---|---|---|
'-' | 实线 | |
':' | 虚线 | |
'--' | 破折线 | |
'-.' | 点划线 |
1.3颜色类型:
颜色标记 | 描述 | |
---|---|---|
'r' | 红色 | |
'g' | 绿色 | |
'b' | 蓝色 | |
'c' | 青色 | |
'm' | 品红 | |
'y' | 黄色 | |
'k' | 黑色 | |
'w' | 白色 |
标记大小与颜色
我们可以自定义标记的大小与颜色,使用的参数分别是:
- markersize,简写为 ms:定义标记的大小。
- markerfacecolor,简写为 mfc:定义标记内部的颜色。
- markeredgecolor,简写为 mec:定义标记边框的颜色。
1.4线的类型
线的类型可以使用 linestyle 参数来定义,简写为 ls。
类型 | 简写 | 说明 |
---|---|---|
'solid' (默认) | '-' | 实线 |
'dotted' | ':' | 点虚线 |
'dashed' | '--' | 破折线 |
'dashdot' | '-.' | 点划线 |
'None' | '' 或 ' ' | 不画线 |
1.5线的颜色
线的颜色可以使用 color 参数来定义,简写为 c。
颜色类型:
颜色标记 | 描述 | |
---|---|---|
'r' | 红色 | |
'g' | 绿色 | |
'b' | 蓝色 | |
'c' | 青色 | |
'm' | 品红 | |
'y' | 黄色 | |
'k' | 黑色 | |
'w' | 白色 |
当然也可以自定义颜色类型,例如:SeaGreen、#8FBC8F 等,完整样式可以参考 HTML 颜色值。
1.6标题与标签的定位
title() 方法提供了 loc 参数来设置标题显示的位置,可以设置为: 'left', 'right', 和 'center', 默认值为 'center'。
xlabel() 方法提供了 loc 参数来设置 x 轴显示的位置,可以设置为: 'left', 'right', 和 'center', 默认值为 'center'。
ylabel() 方法提供了 loc 参数来设置 y 轴显示的位置,可以设置为: 'bottom', 'top', 和 'center', 默认值为 'center'。
1.7Matplotlib 网格线
我们可以使用 pyplot 中的 grid() 方法来设置图表中的网格线。
grid() 方法语法格式如下:
matplotlib.pyplot.grid(b=None, which='major', axis='both', )
参数说明:
- b:可选,默认为 None,可以设置布尔值,true 为显示网格线,false 为不显示,如果设置 **kwargs 参数,则值为 true。
- which:可选,可选值有 'major'、'minor' 和 'both',默认为 'major',表示应用更改的网格线。
- axis:可选,设置显示哪个方向的网格线,可以是取 'both'(默认),'x' 或 'y',分别表示两个方向,x 轴方向或 y 轴方向。
- **kwargs:可选,设置网格样式,可以是 color='r', linestyle='-' 和 linewidth=2,分别表示网格线的颜色,样式和宽度。