Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_python数据分析统计图

x = np.linspace(-10, 10, 800)
y = x ** 3 + 5 * x - 10
plt.plot(x, y)
plt.show()


绘制图形如下  
 ![y=x^3+5x-10](https://img-blog.csdnimg.cn/20210526211027721.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


#### 绘制多曲线图


很多时候我们需要对比多组数据,以发现数据间的异同,此时就需要在一张图片上绘制多条曲线——多曲线图,下图展示了在同一图片中绘制函数 
 
 
 
 
 y 
 
 
 = 
 
 
 x 
 
 
 
 y=x 
 
 
 y=x、 
 
 
 
 
 y 
 
 
 = 
 
 
 
 x 
 
 
 2 
 
 
 
 
 y=x^2 
 
 
 y=x2, 
 
 
 
 
 y 
 
 
 = 
 
 
 l 
 
 
 o 
 
 
 
 g 
 
 
 e 
 
 
 
 x 
 
 
 
 y=log\_ex 
 
 
 y=loge​x以及 
 
 
 
 
 y 
 
 
 = 
 
 
 s 
 
 
 i 
 
 
 n 
 
 
 ( 
 
 
 x 
 
 
 ) 
 
 
 
 y=sin(x) 
 
 
 y=sin(x):



plot_multi_curve.py

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0.1, 2 * np.pi, 100)
y_1 = x
y_2 = np.square(x)
y_3 = np.log(x)
y_4 = np.sin(x)
plt.plot(x,y_1)
plt.plot(x,y_2)
plt.plot(x,y_3)
plt.plot(x,y_4)
plt.show()


上述脚本绘制图形如下:  
 ![多曲线图](https://img-blog.csdnimg.cn/20210526212345453.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


`Tips:一条曲线的绘制需要调用一次plt.plot(),而plt.show()只需调用一次。这种延迟呈现机制是matplotlib的核心,我们可以声明在任何时间绘制图形,但只有在调用plt.show()时才会渲染显示图形。`  
 为了更好的说明这种延迟呈现机制,编写以下代码:



deferred_rendering.py

import numpy as np
import matplotlib.pyplot as plt
def plot_func(x, y):
x_s = x[1:] - y[:-1]
y_s = y[1:] - x[:-1]
plt.plot(x[1:], x_s / y_s)
x = np.linspace(-5, 5, 200)
y = np.exp(-x ** 2)
plt.plot(x, y)
plot_func(x, y)
plt.show()


绘制图形如下:  
 ![延迟呈现示例](https://img-blog.csdnimg.cn/20210526214345286.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


可以看到,尽管其中一个plt.plot()是在plot\_func函数中调用的,它对图形的呈现没有任何影响,因为plt.plot()只是声明了我们要呈现的内容,但还没有执行渲染。因此可以使用此特性结合for循环、条件判断等语法完成复杂图形的绘制,同时也可以在同一张图中组合不同类型的统计图。


#### 读取数据文件绘制曲线图


很多情况下数据都是存储于文件中,因此,需要首先读取文件中的数据,再进行绘制,说明起见,以`.txt`文件为例,其他诸如`Excel、CSV文件`可以使用`pandas、numpy`等库进行读取。  
 假设存在`data.txt`文件如下:



0 1
1 2
2 5
4 17
5 26
6 37


读取数据和绘制的代码如下:



read_txt.py

import matplotlib.pyplot as plt
x, y = [], []
for line in open(‘data.txt’, ‘r’):
values = [float(s) for s in line.split()]
x.append(values[0])
y.append(values[1])
plt.plot(x, y)
plt.show()


如果使用Numpy库,其等效代码可以写为:



import matplotlib.pyplot as plt
import numpy as np
data = np.loadtxt(‘data.txt’)
plt.plot(data[:,0], data[:,1])
plt.show()


![绘制图形](https://img-blog.csdnimg.cn/20210527102858792.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


### 散点图


当绘制曲线图时,我们假设点与点之间存在序列关系。而散点图是简单地绘制点,它们之间并不存在连接。



import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(1000, 2)
plt.scatter(data[:,0], data[:,1])
plt.show()


![散点图](https://img-blog.csdnimg.cn/2021052710422742.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)`Tips:函数plt.scatter()的调用方式与plt.plot()完全相同,分别将点的x和y坐标作为输入参数。`


### 条形图


条形图具有丰富的表现形式,常见的类型包括单组条形图,多组条形图,堆积条形图和对称条形图等。


#### 单组条形图


条形图的每种表现形式都可以绘制成垂直条形图或水平条形图,以单组条形图的两种绘制方式为例。


##### 垂直条形图



import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
plt.bar(range(len(data)), data)
plt.show()


![垂直条形图](https://img-blog.csdnimg.cn/20210527105336249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)`Tips:plt.plot()函数的作用是:接收两个参数,包括每个条形的x坐标和每个条行的高度。`  
 通过可选参数`width`,pyplot.bar()提供了一种控制条形图中条状宽度的方法:



import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
plt.bar(range(len(data)), data, width=0.5)
plt.show()


![修改条形图宽度](https://img-blog.csdnimg.cn/20210527110225118.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


##### 水平条形图


如果更喜欢水平条形外观,就可以使用`plt.barh()`函数,在用法方面与`plt.bar()`基本相同,但是修改条形宽度(或者在水平条形图中应该称为高度)的参数需要使用`height`:



import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
plt.barh(range(len(data)), data, height=0.5)
plt.show()


![水平条形图](https://img-blog.csdnimg.cn/20210527111628808.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


#### 多组条形图


当需要比较不同年份相应季度的销量等此类需求时,我们可能需要多组条形图。



import numpy as np
import matplotlib.pyplot as plt
data = [[10., 20., 30., 20.],[40., 25., 53., 18.],[6., 22., 52., 19.]]
x = np.arange(4)
plt.bar(x + 0.00, data[0], color = ‘b’, width = 0.25)
plt.bar(x + 0.25, data[1], color = ‘g’, width = 0.25)
plt.bar(x + 0.50, data[2], color = ‘r’, width = 0.25)
plt.show()


![多组条形图](https://img-blog.csdnimg.cn/20210527112604612.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


#### 堆积条形图


通过使用`plt.bar()`函数中的可选参数,可以绘制堆积条形图。



import matplotlib.pyplot as plt
y_1 = [3., 25., 45., 22.]
y_2 = [6., 25., 50., 25.]
x = range(4)
plt.bar(x, y_1, color = ‘b’)
plt.bar(x, y_2, color = ‘r’, bottom = y_1)
plt.show()


![堆积条形图](https://img-blog.csdnimg.cn/20210527113350947.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)`Tips:plt.bar()函数的可选参数bottom允许指定条形图的起始值。`  
 可以结合for循环,利用延迟呈现机制堆叠更多的条形:



import numpy as np
import matplotlib.pyplot as plt
data = np.array([[5., 30., 45., 22.], [5., 25., 50., 20.], [1., 2., 1., 1.]])
x = np.arange(data.shape[1])
for i in range(data.shape[0]):
plt.bar(x, data[i], bottom = np.sum(data[:i], axis = 0))
plt.show()


![堆叠条形图](https://img-blog.csdnimg.cn/20210527114739374.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


#### 对称条形图


一个简单且有用的技巧是对称绘制两个条形图。例如想要绘制不同年龄段的男性与女性数量的对比:



import numpy as np
import matplotlib.pyplot as plt
w_pop = np.array([5., 30., 45., 22.])
m_pop = np.array( [5., 25., 50., 20.])
x = np.arange(4)
plt.barh(x, w_pop)
plt.barh(x, -m_pop)
plt.show()


![对称条形图](https://img-blog.csdnimg.cn/20210527115428208.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


图中女性人口的条形图照常绘制。然而,男性人口的条形图的条形图的条形图向左延伸,而不是向右延伸。可以使用数据的负值来快速实现对称条形图的绘制。


### 饼图


饼图可以用于对比数量间的相对关系:



import matplotlib.pyplot as plt
data = [10, 15, 30, 20]
plt.pie(data)
plt.show()


![饼图](https://img-blog.csdnimg.cn/20210527120232309.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)`Tips:plt.pie()函数将一系列值作为输入,将值传递给matplolib,它就会自动计算各个值在饼图中的相对面积,并进行绘制。`


### 直方图


直方图是概率分布的图形表示。事实上,直方图只是一种特殊的条形图。我们可以很容易地使用matplotlib的条形图函数,并进行一些统计运算来生成直方图。但是,直方图非常有用,因此matplotlib提供了一个更加方便的函数:



import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1024)
plt.hist(x, bins = 20)
plt.show()


![直方图](https://img-blog.csdnimg.cn/20210527121241999.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)`Tips:plt.hist()函数的作用是:获取一系列值作为输入。值的范围将被划分为大小相等的范围(默认情况下数量为10),然后生成条形图,一个范围对应一个条柱,一个条柱的高度是相应范围内中的值的数量,条柱的数量由可选参数bins确定。`


### 箱形图


箱形图可以通过方便地显示一组值的中位数、四分位数、最大值和最小值来比较值的分布。



import numpy as np
import matplotlib.pyplot as plt
data = np.random.randn(200)
plt.boxplot(data)
plt.show()


![箱型图](https://img-blog.csdnimg.cn/20210527124224116.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)`Tips:plt.boxplot()函数的作用是:获取一组值,并自动计算平均值、中位数和其他统计量。`  
 箱形图描述:


1. 图中黄线是分布的中位数。
2. 方形箱框包括从下四分位数Q1到上四分位数Q3的50%的数据。
3. 下盒须的下四分位延伸到1.5(Q3-Q1)。
4. 上盒须从上四分位延伸至1.5 (Q3-Q1)。
5. 离盒须较远的数值用圆圈标记。


要在单个图形中绘制多个箱形图,对每个箱形图调用一次`plt.boxplot()`是不可行。它会将所有箱形图画在一起,形成一个混乱的、不可读的图形。如果想要到达符合要求的效果,只需在一次调用`plt.boxplot()`中,同时绘制多个箱形图即可,如下所示:



import numpy as np
import matplotlib.pyplot as plt
data = np.random.randn(200, 6)
plt.boxplot(data)
plt.show()


![多箱形图](https://img-blog.csdnimg.cn/20210527131240902.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


### 三角网格图

### 一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



![](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)



### 二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。



![](https://img-blog.csdnimg.cn/img_convert/8c4513c1a906b72cbf93031e6781512b.png)



### 三、入门学习视频



我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。



![](https://img-blog.csdnimg.cn/afc935d834c5452090670f48eda180e0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP5aqb56eD56eD,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值