python 数据分析(matplotlib)

1.关键字说明

1.1figure图像对象

2.折线图创建(plot)

2.柱状图

3.直方图

4.散点图

5.图片保存

概述: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.关键字说明

函数: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表示要控制的区域

##创建一个简单的折线图

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()

关键字: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()

关键字: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()

关键字: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()

Original: https://blog.csdn.net/weixin_62859191/article/details/126944455
Author: 爱笑的蛐蛐
Title: python 数据分析(matplotlib)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/766672/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球