1.源程序代码
import numpy as np
import matplotlib.pyplot as plt
Emp_data= np.loadtxt('Employedpopulation.csv',delimiter = ",",
usecols=(1,2,3,4,5,6,7,8,9,10),dtype=int)
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
#创建一个绘图对象, 并设置对象的宽度和高度
plt.figure(figsize=(12, 4))
#绘制全部就业人员柱状图
plt.bar(Emp_data[0],Emp_data[1], width = 0.3,color = 'red')
#绘制城镇就业人员柱状图
plt.bar(Emp_data[0],Emp_data[2],width = 0.3,color = 'green')
#绘制乡村就业人员柱状图
plt.bar(Emp_data[0],Emp_data[3], width = 0.3,color = 'blue')
x = [i for i in range(2006,2017)]
plt.xlabel('年份')
plt.ylabel('人员(万人)')
plt.ylim((30000,80000))
plt.xlim(2006,2017)
plt.xticks(x)
plt.title("2007-2016年城镇、乡村和全部就业人员情况柱状图")
#添加图例
plt.legend(('全部就业','城镇就业','乡村就业'))
plt.savefig('Employedpopulation_bar.png')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
Emp_data= np.loadtxt('Employedpopulation.csv',delimiter = ",",
usecols=(1,2,3,4,5,6,7,8,9,10),dtype=int)
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
#创建一个绘图对象, 并设置对象的宽度和高度
plt.figure(figsize=(12, 4))
#绘制全部就业人员柱状图,向前平移柱 0.3
plt.bar(Emp_data[0]-0.3,Emp_data[1], width = 0.3,color = 'red')
#绘制城镇就业人员柱状图
plt.bar(Emp_data[0],Emp_data[2],width = 0.3,color = 'green')
#绘制乡村就业人员柱状图,向后平移柱 0.3,
plt.bar(Emp_data[0]+0.3,Emp_data[3], width = 0.3,color = 'blue')
x = [i for i in range(2006,2017)]
plt.xlabel('年份')
plt.ylabel('人员(万人)')
plt.ylim((30000,80000))
plt.xlim(2006,2017)
plt.xticks(x)
plt.title("2007-2016年城镇、乡村和全部就业人员情况柱状图")
#添加图例
plt.legend(('全部就业','城镇就业','乡村就业'))
plt.savefig('Employedpopulation_bar.png')
plt.show()
采用循环设置文字增加的位置。
for x,y in zip(X,Y1):
plt.text(x+a, y+b, ‘%.2f’ % y, ha=‘center’, va= ‘bottom’)
其中a,b为偏移量。
import numpy as np
import matplotlib.pyplot as plt
Emp_data= np.loadtxt('Employedpopulation.csv',delimiter = ",",
usecols=(1,2,3,4,5,6,7,8,9,10),dtype=int)
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
#创建一个绘图对象, 并设置对象的宽度和高度
plt.figure(figsize=(12, 4))
#绘制全部就业人员柱状图,向前平移柱 0.3
plt.bar(Emp_data[0]-0.3,Emp_data[1], width = 0.3,color = 'red')
#绘制城镇就业人员柱状图
plt.bar(Emp_data[0],Emp_data[2],width = 0.3,color = 'green')
#绘制乡村就业人员柱状图,向后平移柱 0.3,
plt.bar(Emp_data[0]+0.3,Emp_data[3], width = 0.3,color = 'blue')
# 给图加text
X = Emp_data[0] #设置 X坐标
Y1 = Emp_data[1] #设置 y坐标
for x, y in zip(X, Y1):
plt.text(x - 0.3, y +1000, '%i' % y, ha='center')
Y2 = Emp_data[2]
for x, y in zip(X, Y2):
plt.text(x , y + 1000, '%i' % y, ha='center')
Y3 = Emp_data[3]
for x, y in zip(X, Y3):
plt.text(x + 0.3, y + 1000, '%i' % y, ha='center')
x = [i for i in range(2006,2017)]
plt.xlabel('年份')
plt.ylabel('人员(万人)')
plt.ylim((30000,81000))
plt.xlim(2006,2017)
plt.xticks(x)
plt.title("2007-2016年城镇、乡村和全部就业人员情况柱状图")
#添加图例
plt.legend(('全部就业','城镇就业','乡村就业'))
plt.savefig('Employedpopulation_bar.png')
plt.show()
4.对比数据较少时选择柱形图(bar())。也可将柱形图转换为条形图(barh())
plt.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
barh() 函数中 height 代表的是横向柱子的宽度。
import numpy as np
import matplotlib.pyplot as plt
Emp_data= np.loadtxt('Employedpopulation.csv',delimiter = ",",
usecols=(1,2,3,4,5,6,7,8,9,10),dtype=int)
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
#创建一个绘图对象, 并设置对象的宽度和高度
plt.figure(figsize=(8, 4))
#绘制全部就业人员柱状图,向前平移柱 0.3
plt.barh(Emp_data[0]+0.3,Emp_data[1], color = 'red',height=0.3)
#绘制城镇就业人员柱状图
plt.barh(Emp_data[0],Emp_data[2],color = 'green',height=0.3)
#绘制乡村就业人员柱状图,向后平移柱 0.3,
plt.barh(Emp_data[0]-0.3,Emp_data[3], color = 'blue',height=0.3)
# 给图加text
y = [i for i in range(2006,2017)]
plt.ylabel('年份')
plt.xlabel('人员(万人)')
plt.xlim((30000,81000))
plt.ylim(2006,2017)
plt.yticks(y)
plt.title("2007-2016年城镇、乡村和全部就业人员情况柱状图")
#添加图例
plt.legend(('全部就业','城镇就业','乡村就业'))
plt.savefig('Employedpopulation_bar.png')
plt.show()
5.bar()与barh()图的选取
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#不同网站书价格数据
price = [39.5, 39.9, 45.4, 38.9, 33.34,37.89,37.5]
#创建画布
plt.figure(figsize=((8,6)))
plt.subplot(211)
#绘制第一个图
name=['当当网', '中国图书网', '京东商城图书',
'天猫','苏宁易购','淘宝网','亚马逊-电子图书']
plt.barh(range(7), price, height=0.7, color='steelblue', alpha=0.8)
# 从下往上画
plt.yticks(range(7),name )
plt.xlim(30,47)
plt.xlabel("价格")
plt.ylabel('不同平台')
plt.title("不同平台《XX》书的价格一览--条形图")
for x, y in enumerate(price):
plt.text(y + 0.2, x - 0.1, '%s' % y)
plt.subplot(212)
plt.ylabel('价格')
plt.xlabel('不同平台')
plt.xticks(range(7),name)
plt.title("不同平台《XX》书的价格一览--柱形图")
plt.tight_layout(3,1,1)
plt.ylim(10,50)
for x, y in enumerate(price):
plt.text(x-0.2, y + 0.5, '%s' % y)
plt.bar(name,price,0.7,color='pink')
plt.show()
#对比柱状图和条形图的效果!
直方图(Histogram)又称为质量分布图,是一种二维统计图表。它是由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据所属类别,用纵轴表示数量或者占比。
plt.hist(x, bins=10, range=None,
weights=None, cumulative=False, bottom=None,
histtype=‘bar’, align=‘mid’, orientation=‘vertical’,
rwidth=None, log=False, color=None,
label=None, stacked=False)
参数说明:
1)x:指定要绘制直方图的数据。
2)bins:指定直方图条形的个数。接收int,序列或auto.
3)range:指定直方图数据的上下界,忽略较低或较高的异常值。默认包含绘图数据的最大值和最小值。
4)density=True 表示频率分布;density=False 表示的是频数分布。默认False.
5)weights:该参数可为每一个数据点设置权重。与x形状相同的权重数组。将x中的每个元素乘以对应权重值再计数。如果density取值为True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图。
6)cumulative:是否需要计算累计频数或频率。布尔值,如果为True,则计算累计频数。如果density取值为True,则计算累计频率。
7)bottom:可以为直方图的每个条形添加基准线,默认为0。每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子。
8)histtype:指定直方图的类型,默认为’bar’,除此之外,还有’barstacked’,‘step’, ‘stepfilled’。
9)align:设置条形边界值的对齐方式,默认为mid,另外还有left和right。
10)orientation:设置直方图的摆放方向,默认为垂直方向。
11)rwidth:设置直方图条形的宽度。
12)color:设置直方图的填充色。
13)edgecolor:设置直方图边框色。
14)label:设置直方图的标签,可通过legend展示其图例。
15)stacked:当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放。
1.工资分布情况图
绘制某单位的员工工资(salary.csv)分布图。
按分段1000-3000,3000-5000,5000-7000,7000-9000,9000~12000统计员工工资情况。
import numpy as np
import matplotlib.pyplot as plt
salary= np.loadtxt('salary.csv',delimiter = ",",
usecols=(3,),skiprows=1,dtype=int)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=((14,6)))
group = [i for i in range(1000,13000,2000)]
plt.xticks(group)
plt.hist(salary, group,rwidth=0.8,histtype='bar')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
salary= np.loadtxt('salary.csv',delimiter = ",",
usecols=(3,),skiprows=1,dtype=int)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=((14,6)))
group = [i for i in range(1000,13000,2000)]
plt.xticks(group)
return_V=plt.hist(salary, group,rwidth=0.8,histtype='bar')
print(return_V) #返回一个元组
plt.show()
3.hist()的默认频数,density=True频率分布
import numpy as np
import matplotlib.pyplot as plt
salary= np.loadtxt('salary.csv',delimiter = ",",
usecols=(3,),skiprows=1,dtype=int)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=((14,6)))
group = [i for i in range(1000,13000,2000)]
plt.xticks(group)
plt.hist(salary, group,rwidth=0.8,histtype='bar',density=True)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
salary= np.loadtxt('salary.csv',delimiter = ",",
usecols=(3,),skiprows=1,dtype=int)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=((14,6)))
x=[i for i in range(1000,14000,1000)]
plt.xticks(x)
plt.xlim(2000,12000)
plt.hist(salary,bins=20,rwidth=0.8,histtype='bar')
plt.show()
5.histtype参数。
指定直方图的类型(‘bar’(默认),‘barstacked’,‘step’,‘stepfilled’)
1).'bar’是传统的条形直方图;
2).'barstacked’是堆叠的条形直方图;
3).'step’是未填充的条形直方图,只有外边框;
4).‘stepfilled’是有填充的直方图。
当histtype取值为’step’或’stepfilled’,rwidth设置失效,即不能指定柱子之间的间隔,默认连接在一起
import numpy as np
import matplotlib.pyplot as plt
salary= np.loadtxt('salary.csv',delimiter = ",",
usecols=(3,),skiprows=1,dtype=int)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=((14,6)))
x=[i for i in range(1000,14000,1000)]
plt.xticks(x)
plt.xlim(2000,12000)
plt.hist(salary,bins=10,rwidth=0.8,histtype='barstacked',color='r')
plt.hist(salary,bins=20,rwidth=0.3,histtype='step',color='b')
plt.show()
饼图(Pie Graph)是显示一个数据系列中各项的大小与各项总和的比例。
饼图中的数据点显示为整个饼图的百分比。饼图可以比较清楚地反映出部分与部分、部分与整体之间的比例关系。易于显示每组数据相对于总数的大小,而且显示方式直观。
例如不同品类的利润占比、不同类型客户的销售额占比、总体中各组成部分所占比重等。
pyplot中绘制饼图的函数为pie,其语法格式:
pie(x, explode=None, labels=None, colors=None, autopct=None,
pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None,
radius=None, counterclock=True, wedgeprops=None, textprops=None,
center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None)
参数说明:
1)x: 绘制饼图的数据;
2)labels: 每一块区域的说明文字(饼图外侧显示);
3)explode :每一块区域离开中心的距离;
4)startangle :起始角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
5)shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;
6)labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如1则绘制在饼图内侧;
7)autopct :控制饼图内百分比设置,可以使用format字符串或者format function
'%1.1f’指小数点前后位数(没有用空格补齐);
8)pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
9)radius :控制饼图半径,默认值为1;counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={‘linewidth’:3}设置wedge线宽为3。
10)textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
11)colors:饼图的颜色。
12)center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
13)frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
绘制2016年城镇就业人员和乡村就业人员(Employedpopulation.csv)的饼图。
1.源程序代码
import numpy as np
import matplotlib.pyplot as plt
#导入2016年就业数据
Emp_data= np.loadtxt('Employedpopulation.csv',delimiter = ",",
usecols=(1),dtype=int)
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#提取2016年城镇就业数据和乡村就业数据赋值给X
X = [Emp_data[2],Emp_data[3]]
#创建一个绘图对象, 将画布设定为正方形,则绘制的饼图是正圆
plt.figure(figsize=(7, 7))
label = ['城镇就业','乡村就业'] #定义饼图的标签,标签是列表
explode = [0.01,0.02] #设定各项距离圆心的n半径
#绘制饼图(数据,半径,数据对应的标签,百分数保留两位小数点)
plt.pie(X,explode = explode, labels=label,autopct='%.3f%%')
#添加标题
plt.title("2016年城镇和乡村就业人员情况饼图")
#添加图例
plt.legend({'城镇就业','乡村就业'})
plt.savefig('Employedpopulation_pie.png')
plt.show()
2.设置饼图的颜色
import matplotlib._color_data as mcd
for key in mcd.CSS4_COLORS:
print('{}: {}'.format(key, mcd.CSS4_COLORS[key]))
#创建一个绘图对象, 将画布设定为正方形,则绘制的饼图是正圆
plt.figure(figsize=(7, 7))
#设置饼图的颜色
color=['royalblue','#FFF5EE']
plt.pie(X,explode = explode, labels=label,autopct='%.3f%%',colors=color)
#添加标题
plt.title("2016年城镇和乡村就业人员情况饼图")
#添加图例
plt.legend({'城镇就业','乡村就业'})
plt.show()
3.设置文字标签
#创建一个绘图对象, 将画布设定为正方形,则绘制的饼图是正圆
plt.figure(figsize=(7, 7))
label = ['城镇就业','乡村就业'] #定义饼图的标签,标签是列表
explode = [0.01,0.02] #设定各项距离圆心的n半径
#设置文字标签
textprops={'fontsize':16,'color':'k'}
color=['royalblue','#FFF5EE']
plt.pie(X,explode = explode, labels=label,autopct='%.3f%%',
colors=color,textprops=textprops)
#添加标题
plt.title("2016年城镇和乡村就业人员情况饼图")
#添加图例
plt.legend({'城镇就业','乡村就业'})
plt.show()
#创建一个绘图对象, 将画布设定为正方形,则绘制的饼图是正圆
plt.figure(figsize=(7, 7))
label = ['城镇就业','乡村就业'] #定义饼图的标签,标签是列表
#设定各项距离圆心的半径
explode = [0.0,0.06]
#设置文字标签
textprops={'fontsize':18,'color':'k'}
color=['royalblue','#FFF5EE']
plt.pie(X,explode = explode, labels=label,autopct='%.3f%%',
colors=color,textprops=textprops,shadow=True)
#添加标题
plt.title("2016年城镇和乡村就业人员情况饼图")
#添加图例
plt.legend({'城镇就业','乡村就业'})
plt.show()
plt.figure(figsize=(4,6))
plt.pie(X,explode = explode, labels=label,autopct='%.3f%%',
colors=color,textprops=textprops,shadow=True,startangle=90)
#添加标题
plt.title("2016年城镇和乡村就业人员情况饼图")
#添加图例
plt.legend({'城镇就业','乡村就业'})
plt.show()
6.项目实践
import numpy as np
import matplotlib.pyplot as plt
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#导入学生成绩 高等数学 ma,程序设计 pr
data= np.loadtxt('student.csv',delimiter=',',
usecols=(1,2),dtype=np.int,skiprows=1)
# 统计每个分数段的人数
ma_count=[]
for num in data.T:
n=m=k=0
for i in num:
if i>=85:
n=n+1
elif i>=60:
m=m+1
else:
k=k+1
ma_count.append([n,m,k])
#定义饼图的标签和距离
label = ['优秀','及格','不及格']
explode =[0.0,0.0,0.08]
# 给饼图配色
color=['#FF69B4','#6495ED','#9ACD32']
plt.figure(figsize=(10,10))
plt.subplot(121)
plt.title("高等数学分布情况")
plt.pie(ma_count[0], labels=label,autopct='%.2f%%',explode=explode,
colors=color,shadow=True)
plt.legend(loc=4)
plt.subplot(122)
plt.title("程序设计成绩分布情况")
plt.pie(ma_count[1], labels=label,autopct='%.2f%%',explode=explode,
colors=color,shadow=True)
#添加图例
plt.legend(loc=4)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#导入学生成绩 高等数学 ma,程序设计 pr
data= np.loadtxt('student.csv',delimiter=',',
usecols=(1,2),dtype=np.int,skiprows=1)
# 统计每个分数段的人数
ma_count=[]
#创建一个空列表
for num in data.T:
n=m=k=j=r=0
#设置初始值
for i in num:
if i>=95:
n=n+1
#获优秀的人数
elif i>=85:
m=m+1
#获良好的人数
elif i>=70:
k=k+1
#获得中等的人数
elif i>=60:
j=j+1
#获得及格的人数
else:
r=r+1
#获不及格的人数
ma_count.append([n,m,k,j,r])
#定义饼图的标签和距离
label = ['优秀','良好','中等','及格','不及格']
#指的是这一块离中心点的距离
explode =[0.05,0.05,0.05,0.05,0.05]
# 给饼图配色
color=['#FF69B4','#6495ED','#9ACD32','#FFE4E1','#808080']
# 设置了五个颜色
plt.figure(figsize=(10,10))
plt.subplot(121)
plt.title("高等数学分布情况")
plt.pie(ma_count[0], labels=label,autopct='%.2f%%',explode=explode,
colors=color,shadow=True)
#添加图例
plt.legend(loc=4)
plt.subplot(122)
plt.title("程序设计成绩分布情况")
plt.pie(ma_count[1], labels=label,autopct='%.2f%%',explode=explode,
colors=color,shadow=True)
#添加图例
plt.legend(loc=4)
#loc=4 使其位置在右下角,否则会放在其他系统认为最合适的地方
print(data)
plt.savefig('StudentsGrades_pie.png')
plt.show()
以上,matplotlib库关于直方图,柱状图,条形图,饼图的内容就介绍到这里,你学会了吗?
如果需要以上的数据表来模拟,请联系编辑者QQ:2122961493领取。