【泰迪杯-数据分析-1】matplotlib

matplotlib

matplotlib是pyhton的一个数据可视化包,方便展示数据分析结果。其仿照matlab构建。

可以使用cmd通过pip命令安装:pip install matplotlib

使用matplotlib绘图只使用其中的pyplot模块,所以导入库的时候一般使用:

from matplotlib import pyplot as plt(下面介绍的函数方法默认都是plt对象的)

1,绘制折线图

使用plot(x,y)函数绘制图,show函数显示图

# 简单使用
from matplotlib import pyplot as plt 
# 初始化x轴的数字列表
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
# 绘制折线图并显示
plt.plot(x,y)
plt.show()

1.1,设置图大小和保存图片

通过plt.figure()函数设置图的大小等参数

# 例子
from matplotlib import pyplot as plt
# 定义之后绘图会自动使用该绘图配置
fig = plt.figure(figsize=(10,10),dpi=80) 

x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
plt.plot(x,y)

# 保存图
plt.savefig("./figure/figure_2.png")	# 也可以使用svg后缀生成矢量图,但是只能网页使用

1.2,设置x,y轴

通过xticks()yticks函数设置x轴和y轴坐标刻度,参数为刻度数组。

from matplotlib import pyplot as plt
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
plt.plot(x,y)   

# 坐标轴上只会显示列表中的数字
plt.xticks(x)   # 设置x轴的刻度
plt.yticks(y)   # 设置x轴的刻度

plt.show()
  • 其他小技巧:
#可以使用列表推导式生成x轴刻度,例如:
x_label = [i/2 for i in range(0,52,1)] 	# 列表推导式: [可含i表达式 for i in 列表]
# python列表步长path取值
list[::path]
# 可以通过 min() 和 max() 函数快速获得某数组的最大最小值,来快速获取合适的坐标轴刻度
x_label = range(min(x),max(x)+1)		# range()函数最大取不到,要+1
  • 例子:绘制两小时随机气温图:
from matplotlib import pyplot as plt
import random

x = range(1,2*60+1)
y = [random.randint(20,35) for i in range(120)]   
plt.plot(x,y)
plt.show()

设置字符串类型的x,y轴刻度,可以通过xticks()yticks函数配合列表推导式完成

# 生成11:00到12:00每分钟的随机温度图
from matplotlib import pyplot as plt
import random

x = range(1,121)
label_x = ["{}:{}".format(int(i/60+11),int(i%60)) for i in x[::10]]
y = [random.randint(20,35) for i in range(120)]   
plt.plot(x,y)
plt.xticks(x[::10],label_x)		# 刻度值和刻度标签要对应,但是刻度值和点不用一一对应
plt.show()

设置坐标轴标签旋转:可通过xticks()yticksrotation参数来设置

plt.xticks(x[::10],label_x,rotation = 30)	# 参数值大小为标签顺时针旋转的角度

# 会有一个Bug:中文不显示
# 防止坐标轴刻度转动不显示中文	(其他方法P6)
import matplotlib 
font = {'family' : 'MicroSoft YaHei',	# 也可以KaiTi
              'weight' : '10',
              'size'   : '10'}
matplotlib.rc("font",**font)

# 另一种方法
from  matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\SIMLI.TTF')
plt.xticks(x[::10],label_x,rotation = 30,fontproperties=my_font)

1.3,给图添加描述信息

设置x,y轴标签可以通过xlabelylabel来设置。图的标题可以通过title函数来设置

# 例:
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("11:00 ~ 12:00气温折线图")

1.4,绘制网格

使用grid()方法设置网格,默认网格和坐标轴刻度对齐

plt.grid()
# 参数:alpha:网格线不透明度
plt.grid(alpha = 0.1)	

1.5,绘制多次图形

多次调用plot函数即可多次画图,并通过label参数并调用legend方法设置图例

from matplotlib import pyplot as plt
from matplotlib import font_manager
import random

my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\SIMLI.TTF')
x = range(1,2*60+1)
plt.figure(figsize=(20,8),dpi=80)
y1 = [random.randint(20,35) for i in range(120)]   
y2 = [random.randint(20,35) for i in range(120)]   
plt.plot(x,y1,label='A地')
plt.plot(x,y2,label='B地')
plt.legend(prop=my_font,loc=0)        # prop 参数设置字体   loc 设置图例位置,默认0为最佳位置,其他位置看源码(需要再深入一层)
plt.show()

1.5,设置线条颜色和风格

可通过plot方法的color参数设置线条的颜色:r/g/b/w/c/m/y/k/#00ff00

可通过plot方法的linestyle参数设置线条的风格:-/–/-./😕‘’(空,无线条)/

可通过plot方法的linewidth参数设置线条的粗细

网格方法也适用该方法

from matplotlib import pyplot as plt
from matplotlib import font_manager
import random

my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\SIMLI.TTF')
x = range(1,2*60+1)
plt.figure(figsize=(20,8),dpi=80)
y1 = [random.randint(20,35) for i in range(120)]   
y2 = [random.randint(20,35) for i in range(120)]   
plt.plot(x,y1,label='A地',color='red',linestyle='--')
plt.plot(x,y2,label='B地',color='b',linestyle=':')
plt.legend(prop=my_font,loc=0)        # prop 参数设置字体   loc 设置图例位置,默认0为最佳位置,其他位置看源码(需要再深入一层)
plt.show()

2,绘制其他常用统计图

常用统计图比较

统计图特点
折线图反应变化趋势
直方图绘制连续数据,反应分布情况
条形图绘制离散数据,比较数据之间的差别
散点图判断变量之间是否有关联,展示分布规律

2.1,绘制散点图

使用scatter(x,y)函数绘制散点图

from cProfile import label
from turtle import title
from matplotlib import pyplot as plt
from  matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\SIMLI.TTF')

plt.figure(figsize=(20,8),dpi=80)

y_3 = [12,13,15,18,16,12,19]
y_10 = [15,16,13,15,12,11,9]

x_3 = range(0,7)
x_10 = range(14,21)

plt.scatter(x_3,y_3,label="3月")
plt.scatter(x_10,y_10,label="10月")
# 设置x轴
label_x = ["3/{}".format(i) for i in range(1,8)] + ["..."] + ["10/{}".format(i) for i in range(1,8)] 
plt.xticks(list(x_3)+[8,]+list(x_10),label_x)
# 添加描述信息
plt.xlabel("日期",fontproperties=my_font)
plt.ylabel("温度",fontproperties=my_font)
plt.title("3/10月份温度变化散点图",fontproperties=my_font)
plt.legend(prop=my_font)
plt.show()

2.2,绘制条形图

使用bar(x,y)方法绘制条形图

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\SIMLI.TTF')

# 导入数据
x = ['长津湖','战狼2','你好,李焕英']		 # 名字太长可以旋转角度或者添加换行
y = [56.95,56.94,54.13]
# 绘制条形图
plt.bar(x,y,width=0.1)      # width 参数可以设置条形的宽度
plt.xticks(fontproperties=my_font)
plt.show()

使用barh方法绘制横向的条形图:

from turtle import color
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\SIMLI.TTF')

# 导入数据
x = ['长津湖','战狼2','你好,李焕英']
y = [56.95,56.94,54.13]
# 绘制条形图
plt.barh(x,y,height=0.1,color="orange")      # 不同于普通条形图,这里要使用 height 参数设置条形的高度
plt.yticks(fontproperties=my_font)      # 这里要使用 yticks 设置
plt.grid()
plt.ylabel("电影名",fontproperties=my_font)
plt.xlabel("票房",fontproperties=my_font)
plt.title("电影票房")
plt.show()

多次绘制条形图,使用列表推导式来快捷生成坐标,中间添加坐标刻度

from cProfile import label
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\SIMLI.TTF')
plt.figure(figsize=(20,8))
movies = ['肖申克的救赎','楚门的世界','海上钢琴师']
day_1 = [100,89,79]
day_2 = [98,92,88]
day_3 = [100,91,95]

bar_width = 0.2
x_1 = list(range(len(movies)))
x_2 = [i+bar_width for i in x_1]
x_3 = [i+bar_width*2 for i in x_1]
# 绘制多次条形图
plt.barh(x_1,day_1,label="9/1",height=bar_width)
plt.barh(x_2,day_2,label="9/2",height=bar_width)
plt.barh(x_3,day_3,label="9/3",height=bar_width)

plt.yticks(x_2,movies,fontproperties=my_font)	# 再中间一条添加刻度

# 添加描述
plt.xlabel("热度",fontproperties=my_font)
plt.ylabel("电影",fontproperties=my_font)
plt.legend(prop=my_font)
plt.grid()
plt.show()

2.3,绘制直方图

通过hist(data,group_num)函数绘制直方图,其中:data为要绘制直方图的数据,group_num为想要绘制的组数。

  • 组数 = 极差 / 组距

  • 数据越集中,组数多点好;数据分散,组距小点好

  • 默认绘制频数分布直方图,若要绘制频率分布直方图,调用方法时传递参数density=True

from matplotlib import pyplot as plt
from matplotlib import font_manager
import random
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\SIMLI.TTF')

data = [random.randint(50,100) for i in range(1000)]
# 绘制直方图
dis = 10 # 定义组距 
group_num = (max(data)-min(data))//dis   # 计算组数(//为向下取整除)

plt.hist(data,group_num)
# 设置坐标轴的方式较为固定:
plt.xticks(list(range(min(data),max(data)+dis,dis)))        # +dis防止最后一个数无法显示
plt.grid()
plt.show()
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值