目录
概述:matplotlib使用来使numpy和pandas处理出来的数据可以可视化。
在使用matplotlib画图时,在图层上不可以显示中的的两个解决方法:
# 第一种
# 解决中文不能显示的问题
matplotlib.rc('font', family='FangSong')
# 第二种
# 解决汉字不能够出现的问题
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False # 解决负号的问题
# 设置分辨率
plt.rcParams['figure.dpi'] = 100
# 设置大小
plt.rcParams['figure.figsize'] = (8, 6)
1.关键字说明
1.1figure图像对象
函数:figure(num,figsize,dpimfacecolor,edgecolor,frameon)
参数说明:
num:图形编号或名称,数字为编号,字符串为名称
figsize:指定figure的宽和高,单位为英寸
dpi:绘制图对象的分辨率,即每英寸为多少个像素
facecolor:背景颜色设置
frameon:是否显示边框
##使用
import matplotlib.pyplot as plt
fig = plt.figure('fl', figsize=(8, 6), dpi=100, facecolor='blue', edgecolor='yellow', frameon=True)
plt.plot()
plt.show()
1.2 图形对象.title()设置图像标题
1.3 图形对象.plot(color,linestyle,label,marker,alpha):绘制图像
参数说明:
color:线条的颜色
linestyle:线条的样式
label:指定图例
marker:标记
alpha:控制透明度,范围在0~1之间
1.4 图形对象.legend(loc='lower left'):调用该方法才可以显示图例,默认找到最好的方法
1.5 图形对象.xticks():可以改变x轴的刻度
图形对象.yticks():可以改变y轴的刻度
1.6 图形对象.grid(linewidth,color,linestyle,axis):显示网格
参数说明:
linewidth:网格线条的宽度
color:网格线条的颜色
linestyle:线条样式
axis:控制显示横竖者的网格,0显示横,1显示竖
1.7 图形对象.xlabel():x轴的描述信息
图形对象.ylabel():y轴的描述信息
1.8 图形对象.gca():获取当前图像对象的四条边,返回一个对象
该对象.spines[].set_color("none"):可以控制去掉哪一条边,top,bottom,left,right(分别表示上下左右)
该对象.spines[].set_position(元组):移动坐标轴,传入的是一个元组,方式:
data:按数值移动
outward:
axes:按百分比移动,0.5表示50%
1.9 图形对像.ylim():控制x,y的区间
2.0 图形对象.subplot(111):分割图层,如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为是不可共享图层区域,第一个1表示一行,第二个1表示1列,第三个1表示要控制的区域
2.折线图创建(plot)
##创建一个简单的折线图
import matplotlib.pyplot as plt
import numpy as np
# 使用numpy准备数据
x = np.arange(-50, 50)
y = [i**2 for i in range(-50, 50)]
y1 = x*2
# 解决汉字不能够出现的问题
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False # 解决负号的问题
# 创建画布
plt.figure(figsize=(10, 8), dpi=80)
# 显示标题
plt.title("第一个图表")
# 显示x、y轴
plt.xlabel('x轴', fontsize=20) # fontsize设置大小
plt.ylabel('y轴', fontsize=20)
# 设置刻度 rotation:把x轴的刻度改为倾斜的,labels:把x轴刻度的内容修改
plt.xticks(range(-50, 50, 5), labels=[i for i in range(1, 21, 1)], rotation=45)
# 显示网格
plt.grid(linewidth=1, color='red', linestyle='--', axis='x')
# 使用plot绘制线性图表
plt.plot(x, y, linewidth=5, linestyle='--', label='信宜') #
plt.plot(x, y1, label='茂名') # 一个显示内容只能在plot中使用一次
# 显示图例 默认是找到最好的途径
plt.legend(loc='lower left')
# text:在图里显示文本内容
tex = [i for i in range(1, 21, 1)]
for a, b in zip(tex, y):
plt.text(a, b, b)
plt.show()
##折线图中坐标轴的操作
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-50, 51)
y = x**2
# 获取当前坐标轴
ax = plt.gca()
# 通过坐标轴spines,确定 top,bottom,left,right(分别表示上下左右)
# 不需要右侧和上侧的线条
ax.spines['right'].set_color("none")
ax.spines['top'].set_color("none")
# 移动x、y轴,使用position位置参数有三种,data,outward,axes
# data:按数值移动,传入的参数是x或y轴的刻度值
# ax.spines['left'].set_position(('data', 0.0)) # 接收的是一个元组
ax.spines['left'].set_position(('axes', 0.5)) # 按百分比移动,0.5即%50
ax.spines['bottom'].set_position(('data', 0.0)) # 移动x轴
# 限制x、y轴的区间
plt.ylim(-1000, 2500)
# plt.plot(x, y, color, alpha, linestyle, lineswidth, marker, markeredgecolor, markersize, markeredgewidth)
# alpha:控制透明度,范围在0~1之间
"""
marker:标记
1.'.':点标记
2.'o':圆圈标记
3.'x':’X‘标记
4.’D‘:砖石标记
5.’H‘:六边形标记
6.’s‘:正方形标记
7.’+‘:加号标记
"""
plt.plot(x, y, marker='D', alpha=0.5)
plt.show()
##创建一个多子图
# 关键字 subplot
# 如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为他们不可以共享绘图区域
# 设置标题的三种方法:
# 1.在创建时直接设置
# 2.在使用pyplot模块中的方法设置
# 3.使用返回的区域对象设置
import matplotlib.pyplot as plt
import matplotlib
# plt.rcParams["font.sans-serif"] = ["SimHei"] # 中文显示的第二个方法
matplotlib.rc("font", family="SimHei") # 中文显示的第一个方法
fig1 = plt.figure(figsize=(8, 6))
fig1.add_subplot(111, title='底层') # 分割成1*1,当前所在第一个位置
plt.plot(range(20, 30))
fig1.add_subplot(221) # 分割成2*2,当前所在第一个位置
plt.plot(range(20, 30))
# 创建时直接设置
fig1.add_subplot(224, title='4', xlabel='4 axis')
plt.plot(range(20, 30))
# 使用pyplot模块设置
plt.subplot(223)
plt.title("3")
plt.plot(range(20, 30))
# 使用返回区域对象设置
ax1 = plt.subplot(222)
ax1.set_title('2')
ax1.plot(range(20, 30))
# 紧凑型布置:解决文字重叠问题
plt.tight_layout()
plt.show()
##subplot详解
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
import math
# 汉字问题解决
matplotlib.rc('font', family="SimHei")
plt.rcParams["axes.unicode_minus"] = False # 解决负号不能显示的问题
# 创建创建2行2列的子图,返回图形对象(画布),所有子图的坐标
fig, axes = plt.subplots(2, 2)
# x轴数据
x = np.arange(1, 5)
# 第一个区域
axes[0][0].plot(x, x**x)
axes[0][0].set_title('squear')
axes[0][0].grid(linestyle='--')
# 第二个区域
axes[0][1].plot(x, x**2)
axes[0][1].set_title('二次函数')
axes[0][1].grid(linestyle='--')
# 第三个区域
axes[1][0].plot(x, x)
axes[1][0].set_title('一次函数')
axes[1][0].grid(linestyle='--')
# 第四个区域
axes[1][1].plot(x, -x)
axes[1][1].set_title('')
axes[1][1].grid(linestyle='--')
plt.tight_layout()
plt.show()
2.柱状图
关键字:bar(x,heitht,width,float,bottom,*,align,str='center',data)
参数说明:
参数说明: 1.x:表示x坐标 2.height:表示柱状图高度 3.width:表示柱状图的宽度 4.bottom:柱状图的起始位置,也就是y轴的起始坐标 5.align:柱状图的中心位置,'center','lege'边缘,默认值为None 6.color:柱状图颜色,默认为蓝色 7.alpha:透明度,取值在0~1之间,默认值为1 8.label:标签,设置后需要调用plt.legend()生成 9.edgecolor:边框颜色 10.linewidth:边框宽度 11.tick_label:柱子的刻度标签 12.linestyle:线条样式
##绘制一个基本柱状图
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
# x轴数据
x = range(5)
# y轴数据
y = [12, 34, 123, 23, 23]
# 设置图形标题
plt.title('基本柱状图')
# 绘制网格
plt.grid(linestyle='--', alpha=0.5)
# 绘制图形 bottom:一个对应一个,facecolor:只能接一个值,color可以接一个序列,会循环赋值
plt.bar(x, y, bottom=[25, 12, 32, 34, 20], color=['r', 'g', 'y', 'b', 'k'], alpha=0.5, edgecolor='r', linewidth=5)
plt.show()
##同位置柱状图
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
matplotlib.rc('font', family='SimHei')
# 国家
country = ['中国', '美国', '德国', '英国', '日本']
# 金牌个数
gold_num = [20, 15, 16, 13, 18]
# 银牌个数
silver_num = [30, 23, 34, 21, 32]
# 铜牌个数
bronze_num = [22, 34, 13, 43, 22]
x = np.arange(5)
plt.figure(figsize=(8, 6), dpi=80)
# 金牌插入
plt.bar(x, gold_num, color='r', width=0.2, label='金牌')
# 银牌插入
plt.bar(x + 0.2, silver_num, color='b', width=0.2, label='银牌')
# 铜牌插入
plt.bar(x + 0.4, bronze_num, color='y', width=0.2, label='铜牌')
# 显示图例
plt.legend()
# 改变刻度
plt.xticks(x + 0.2, labels=country)
# 在柱状图顶部显示具体数值
for i in range(len(country)):
# text(x,y,参数1,va,ha)
# x,y表示在图表中的位置,参数3表示要显示的数值,va表示垂直方向的位置,ha表示水平方向的位置
# 金牌
plt.text(x[i], gold_num[i], gold_num[i], va='bottom', ha='center')
# 银牌
plt.text(x[i] + 0.2, silver_num[i], silver_num[i], va='bottom', ha='center')
# 铜牌
plt.text(x[i] + 0.4, bronze_num[i], bronze_num[i], va='bottom', ha='center')
plt.show()
##水平柱状图
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 负号问题
plt.rcParams['axes.unicode_minus'] = False
# 设置分辨率
plt.rcParams['figure.dpi'] = 100
# 设置大小
plt.rcParams['figure.figsize'] = (8, 6)
# 堆叠水平柱状图
def func1():
country = ['中国', '美国', '德国', '英国', '日本']
gdp1 = [8934, 3489, 5443, 2443, 3345]
gdp2 = [7934, 3323, 3444, 5453, 2342]
gdp3 = [9083, 4903, 5839, 5839, 8030]
gdp1 = np.array(gdp1)
gdp2 = np.array(gdp2)
gdp3 = np.array(gdp3)
# 水平堆叠柱状图
plt.barh(country, gdp1, color='r', height=0.2)
plt.barh(country, gdp2, left=gdp1, color='b', height=0.2)
plt.barh(country, gdp3, left=gdp1 + gdp2, color='y', height=0.2)
# 显示具体数据
sum = gdp1 + gdp2 + gdp3 # 总数据
for i in range(len(country)):
# va:控制文本x的位置参数,表示文本的左边,中间或者右边(表示垂直方向的位置)
# ha:控制文本的y的位置参数,表示文本的底部,中心或者顶部(表示水平方向的位置)
plt.text(sum[i], country[i], sum[i], va='center', ha='left') # 文本边界在内容的左边,内容在文本边界的中心
plt.show()
# 多柱水平柱状图
def func2():
country = ['中国', '美国', '德国', '英国', '日本']
# 金牌个数
gold_num = [20, 15, 16, 13, 18]
# 银牌个数
silver_num = [30, 23, 34, 21, 32]
# 铜牌个数
bronze_num = [22, 34, 13, 43, 22]
y = np.arange(5)
plt.barh(y, gold_num, color='r', height=0.2, label='金牌')
plt.barh(y - 0.2, silver_num, color='b', height=0.2, label='银牌')
plt.barh(y - 0.4, bronze_num, color='y', height=0.2, label='铜牌')
plt.legend()
plt.yticks(y - 0.2, labels=country)
for i in range(len(country)):
plt.text(gold_num[i], y[i], gold_num[i], va='center', ha='left')
plt.text(silver_num[i], y[i] - 0.2, silver_num[i], va='center', ha='left')
plt.text(bronze_num[i], y[i] - 0.4, bronze_num[i], va='center', ha='left')
plt.show()
func2()
3.直方图
关键字:matplotlib.hist(x,bins,range,density,weights,cumulative,bottom,histtype,alingn,orientation,rwidth,log,color,label,stacked,normed,data)
参数说明:
1.x:数据,必须是一维数组 2.bins:直方图的柱数,即要分的组数 3.weights:与x形状相同的权重数组,将x中的每个元素乘以对应的权重值再计数 4.density: 5.bottom:柱子上下移动的值 6.histtype: 7.align:{left,mid,right},left:柱子的中心位于bins左边缘,mid:柱子位于bins左右边缘中心,right:柱子的中心位于bins的右边缘
##创建一个基本直方图
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
x = np.random.randint(140, 180, 300)
# 创建一个画布
fig, ax = plt.subplots()
# 该函数返回了三个值
# 1.num:拿到的是柱子在y轴中的值
# 2.bins:拿到的是分组的值
# 3.pathches:拿到的是一个列表迭代器
num, bins, pathches = plt.hist(x, bins=10, edgecolor='w') # 返回三个值
plt.title('数据分析')
plt.xlabel('身高')
plt.ylabel('比率')
# 添加一个折线图
ax.plot(bins[:10], num, '--', marker='o')
print(num)
print(bins)
for i in pathches:
print(i)
print(i.get_x()) # 拿到数据需要使用get
plt.show()
##创建一个不等距的直方图
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ["SimHei"]
xbin = [50, 70, 90, 100, 140, 150]
x = np.random.normal(100, 20, 100)
fig, ax = plt.subplots()
ax.hist(x, xbin, color='g', edgecolor='w')
ax.set_title('不等距分组')
plt.show()
4.散点图
关键字:scatter(x,y,s,c,marker,cmap,norm,vmin,vmax,alpha,linewidth,edgecolors,plotno,nfinite)
参数说明:
1.s:散点的面积 2.c:散点的颜色 3.marker:散点样式 4.alpha:散点透明度 5.linewidths:散点的边缘线宽度 6.edgecolors:散点的边缘颜色 7.cmap:c是一个浮点数数组的时候才使用
##创建一个基本散点图
import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([22, 32, 11, 32, 23, 43, 11, 21, 15])
# 颜色随机
colors = np.random.rand(9)
plt.scatter(x, y, c=colors, cmap='Set1')
plt.show()
5.图片保存
关键字:savefig(fname,dpi,facecolor,format,transparent)
参数说明:
facecolor:图形表面颜色 format:文件格式 transparent:用于将图片背景设置为透明
##保存一张图片
import matplotlib.pyplot as plt
import numpy as np
# 数据
x = np.arange(20)
y = x**2
# 画图
plt.plot(x, y)
# 保存图片要注意的
# 1.第一个参数就是保存的路径
# 2.如果路径中包含未创建的文件夹,会报错,需要手动或者使用os模块
# 3.必须在调用plt.show()之前保存,否则将保存的是空白图片
plt.savefig('zhe.png')
plt.show()