python matplotlib模块使用
1.matplotlib 简介
Matplotlib 是 Python 的绘图库,提供了一种有效的 MatLab 开源替代方案。
2.matplotlib 生成折线图
import pandas as pd
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
import random
x = [x for x in range(2, 26, 2)]
y = [i * i + 1 for i in x]
/* 设置中文字体和负号正常显示*/
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(16,10),dpi=80)
plt.plot(x,y)
plt.ylabel("y轴")
plt.xlabel("x轴")
plt.title("y = x^2 + 1 函数")
plt.show()
结果展示如下
3.matplotlib 生成条形图
3.1 网易云华语男歌手热门歌曲评论情况
import pandas as pd
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
import random
# x = [x for x in range(2, 26, 2)]
# #y = random.sample(range(12,30),12)
# y = [i * i + 1 for i in x]
# #plt.figure(figsize=(20,12),dpi=60)
# plt.plot(x,y)
# plt.show()
pre_path = 'D:\\WorkSpace\\python\\file\\comment华语男歌手'
df = pd.DataFrame()
#循环读取文件
for i in range(18):
file_path = pre_path+str(i)+'.csv'
# 没有列头 自定义列头
data = pd.read_csv(file_path,header=None,names=['歌手名','歌曲名','评论数'])
df = df.append(data,ignore_index=True)
#数据处理
df = df.drop_duplicates(keep='first') #去除重复行
df['评论数'].replace({'评论':'-1'},inplace=True)
df['评论数']=pd.to_numeric(df['评论数'],errors='coerce')
df = df[df['评论数']!=-1] #剔除问题数据
#纬度值获取
df0 = df[df['评论数']==0]['歌曲名'].count()
df1k = df[(df['评论数']>0) & (df['评论数']<1000)]['歌曲名'].count()
df5K = df[(df['评论数']>=1000) & (df['评论数']<5000)]['歌曲名'].count()
df1W = df[(df['评论数']>=5000) & (df['评论数']<10000)]['歌曲名'].count()
df3W = df[(df['评论数']>=10000) & (df['评论数']<30000)]['歌曲名'].count()
df5W = df[(df['评论数']>=30000) & (df['评论数']<50000)]['歌曲名'].count()
df7W = df[(df['评论数']>=50000) & (df['评论数']<70000)]['歌曲名'].count()
df10W = df[(df['评论数']>=70000) & (df['评论数']<100000)]['歌曲名'].count()
df30W = df[(df['评论数']>=100000) & (df['评论数']<300000)]['歌曲名'].count()
df50W = df[(df['评论数']>=300000) & (df['评论数']<500000)]['歌曲名'].count()
df100W = df[(df['评论数']>=500000) & (df['评论数']<1000000)]['歌曲名'].count()
dfgt100W = df[df['评论数']>=1000000]['歌曲名'].count()
#坐标值定义
datax = ['0','(0,1000)','[1000,5000)','[5000,10000)','[10000,30000)','[30000,50000)','[50000,70000)','[70000,100000)','[100000,300000)','[300000,500000)','[500000,1000000)','[1000000,)']
datay = [df0,df1k,df5K,df1W,df3W,df5W,df7W,df10W,df30W,df50W,df100W,dfgt100W]
# 设置中文字体和负号正常显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 设置图形打下
plt.figure(figsize=(20,10),dpi=90)
label_list = datax # 横坐标刻度显示值
num_list = datay # 纵坐标值
x = range(len(num_list))
"""
绘制条形图
x:横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(x=x, height=num_list, width=0.4, alpha=0.8, color='blue', label="歌曲数")
#plt.ylim(0, 60000) # y轴取值范围
plt.yticks(range(0,70000,5000)) #设置y轴坐标
plt.ylabel("数量")
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index for index in x], label_list) #设置x轴坐标
plt.xlabel("评论区间")
plt.title("华语男歌手热门歌曲50首评论分布情况")
plt.legend() # 设置题注
# 编辑文本
for rect in rects1:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
plt.show()
以下是截至2021年3月31号,网易云华语男歌手热门歌曲评论情况:
从图形上可以明显看出,歌曲的评论都集中在0到1000这个区间,评论1w以上的歌曲在3000首左右;
3.2 第六次人口普查年龄、性别数据分布情况
import pandas as pd
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
import random
def showPicturexyy(label_list,num_list1,num_list2,label1='类型1',label2='类型2',xlabel='x轴坐标',title='标题'):
'''生成柱状图 y轴为2
label_list 为 x 轴坐标 xlabel 为 x轴 说明
num_list1 为 y 轴 值1 label1 为 y轴 值1说明
num_list2 为 y 轴 值2 label2 为 y轴 值2说明
title 为标题
'''
# # 设置中文字体和负号正常显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# # 设置图形打下
plt.figure(figsize=(20,10),dpi=90)
# label_list = ['2014', '2015', '2016', '2017'] # 横坐标刻度显示值
# num_list1 = [20, 30, 15, 35] # 纵坐标值1
# num_list2 = [15, 30, 40, 20] # 纵坐标值2
x = range(len(num_list1))
"""
绘制条形图
left:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(x=x, height=num_list1, width=0.4, alpha=0.8, color='orange', label=label1)
rects2 = plt.bar(x=[i + 0.4 for i in x], height=num_list2, width=0.4, color='green', label=label2)
plt.ylim(min(min(num_list1),min(num_list2))*0.9, max(max(num_list1),max(num_list2))*1.1) # y轴取值范围
plt.ylabel("数量")
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index + 0.2 for index in x], label_list)
plt.xlabel(xlabel)
plt.title(title)
plt.legend() # 设置题注
# 编辑文本
for rect in rects1:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
for rect in rects2:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
plt.show()
pre_path2010 = 'D:\\WorkSpace\\python\\file\\2020全国分年龄、性别的人口.csv'
df2010 = pd.read_csv(pre_path2010)
#print(df2010)
df2010 = df2010.loc[df2010.index[[1, 7, 13, 19, 25, 31, 37, 43, 49, 55, 61, 67, 73, 79, 85, 91, 97, 103, 109, 115, 121]], ['年龄','合计','男','女']]
print(df2010)
datarate = (df2010['男']*100/df2010['女']).astype('int').to_list()
print(datarate)
df2010['合计'] = df2010['合计']/10000
df2010['男'] = df2010['男']/10000
df2010['女'] = df2010['女']/10000
df2010['合计']=df2010['合计'].astype('int')
df2010['男']=df2010['男'].astype('int')
df2010['女']=df2010['女'].astype('int')
# #纬度值获取
datax = df2010['年龄'].to_list()
dataym = df2010['男'].to_list()
datayf = df2010['女'].to_list()
#print(max(max(dataym),max(datayf)))
showPicturexyy(datax,dataym,datayf,'男','女','年龄段','第六次人口普查年龄、性别数据(单位:万人,时间:2010)')
#男女比例折线图
# matplotlib.rcParams['font.sans-serif'] = ['SimHei']
# matplotlib.rcParams['axes.unicode_minus'] = False
# plt.figure(figsize=(20,10),dpi=90)
# plt.plot(datax,datarate)
# plt.show()
从图形上可以看到,在2010年10到19岁的这批人,到了2021年已经是21到30岁了,这个区间的男女比例失调严重,男多女少明显;