python-learning-第二季-画图matplotlib

https://www.bjsxt.com/down/8468.html

 

 

绘制方法:

 

绘制直线:

#coding:utf-8
import matplotlib.pyplot as plt
#准备绘制的两个点(1,2),(4,8)
#调用绘制的plot方法
plt.plot([1,4], [2,8]) #两个点的x和y写在一起
#显示绘制的图
plt.show()

返回:

 

绘制折线图

#coding:utf-8
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [1,4,9,16,25]
#调用绘制的plot方法
plt.plot(x, y) #两个点的x和y写在一起
#显示绘制的图
plt.show()

返回:

 

开始学习-设置样式

windows不支持中文,添加:

#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

macos不支持中文,可见mac中matplotlib不支持中文的解决办法

 

运行的时候为:

#coding:utf-8
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [1,4,9,16,25]
#调用绘制的plot方法
plt.plot(x, y, linewidth=5)
plt.xlabel('x')
plt.ylabel('y=x^2')
#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['Songti SC'] #用来正常显示中文标签
#添加标题
plt.title('多个点绘制折线图') #会出现乱码

#显示绘制的图
plt.show()

就成功了:

 

绘制曲线:

#coding:utf-8
import matplotlib.pyplot as plt
x = range(-100, 100)
y = [i**2 for i in x]
#调用绘制的plot方法
plt.plot(x, y, linewidth=5)
plt.xlabel('x')
plt.ylabel('y=x^2')
#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['Songti SC'] #用来正常显示中文标签
#添加标题
plt.title('多个点绘制折线图') #会出现乱码
#保存成图片
plt.savefig('result') #默认格式是png,可以指定为jpg格式result.jpg
#显示绘制的图
plt.show()

返回:

 

正弦和余弦曲线

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
#0-10之间100个等差数
x = np.linspace(0,10,100)
y = np.sin(x)
#调用绘制的plot方法
plt.plot(x, y, linewidth=5)

cos_y = np.cos(x)
plt.plot(x, cos_y, linewidth=5)
#显示绘制的图
plt.show()

返回:

 

subplot的使用:

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
#0-10之间100个等差数
x = np.linspace(0,10,100)
y = np.sin(x)
plt.subplot(2,2,1)
#调用绘制的plot方法
plt.plot(x, y, linewidth=5)

cos_y = np.cos(x)
plt.subplot(2,2,3)
plt.plot(x, cos_y, linewidth=5)

y_line = [i**2 for i in x]
plt.subplot(2,2,4)
plt.plot(x, y_line, linewidth=5)
#显示绘制的图
plt.show()

返回:

 

 修改某一个画布的x轴的坐标:

plt.xlim(-5,20) : x轴

plt.ylim(-5,20) : y轴

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
#0-10之间100个等差数
x = np.linspace(0,10,100)
y = np.sin(x)
plt.subplot(2,2,1)
#调用绘制的plot方法
plt.xlim(-5,20)
plt.plot(x, y, linewidth=5)

#显示绘制的图
plt.show()

返回:

 

绘制散点图

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
#0-10之间100个等差数
x = np.linspace(0,10,100)
y = np.sin(x)
#调用绘制的plot方法
plt.scatter(x, y, linewidth=5)
#等价于
#plt.plot(x, y, 'o')

#显示绘制的图
plt.show()

返回:

⚠️plot绘制图形的速度由于scatter,所以如果画一堆点,而且点的形式没有差别,那么就使用plot;如果点的形式有差别,即点的大小和颜色有差别时,则必须使用scatter

 

点大小颜色不同的情况

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
#10中大小,100种颜色的散点图

#使得执行多次,每次获得的随机数都相同
np.random.seed(0)

#100个随机点
x = np.random.rand(100)
y = np.random.rand(100)

#颜色的类别数量要等于点的个数
#大小则没有要求
#设置10种大小,值过小,所以乘500 size
= np.random.rand(10)*500 #生成100种颜色 color = np.random.rand(100) #调用绘制的plot方法,alpha表示透明度,使得重叠的部分可见 plt.scatter(x, y, s=size, c=color, alpha=0.7) #等价于 #plt.plot(x, y, 'o') #显示绘制的图 plt.show()

返回:

当点的个数大于大小的个数时,循环设置。因为有10种大小,所以第一个点和第11个点是大小一样的,以此类推

 

绘制不同样式不同颜色的线条

还有其他的

 

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,100)

plt.plot(x, x+0, '--g')
plt.plot(x, x+1, '-.r')
plt.plot(x, x+2, ':b')
plt.plot(x, x+3, '.k')
plt.plot(x, x+4, ',c')
plt.plot(x, x+5, '*y')

#显示绘制的图
plt.show()

返回:

 

添加图例legend():

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,100)

#使用legend()图例,给plot方法添加参数label
plt.plot(x, x+0, '--g', label='--g')
plt.plot(x, x+1, '-.r', label='-.r')
plt.plot(x, x+2, ':b')
plt.plot(x, x+3, '.k')
plt.plot(x, x+4, ',c')
plt.plot(x, x+5, '*y')
plt.legend(loc='lower right') #默认位置在左上角loc='upper left',使用参数loc修改为右下角
#显示绘制的图
plt.show()

返回:

还有其他配置参数:

透明度就是当图例遮住图时,能够透过看到线条

 

绘制柱状图

bar的宽度的说明:

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
x = [1980, 1985, 1990, 1995]
y = [1000, 3000, 4000, 5000]

#设置为原来柱宽的三倍
plt.bar(x, y, width=3)

#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['Songti SC']

#修改x坐标的值
x_label = ['1980年', '1985年', '1990年', '1995年']
plt.xticks(x, x_label) #即x轴坐标就只有x设置的这4个值了

#给x、y坐标加名称
plt.xlabel('年份')
plt.ylabel('销量')
plt.title('根据年份销量对比图')
#显示绘制的图
plt.show()

返回:

 

 bar和barh函数的使用

barh:水平方向绘制

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)
x = np.arange(5)
y = np.random.randint(-5,5,5)

#将画布分成1行2列
#第一个区域画bar
plt.subplot(1,2,1)
#添加颜色
plt.bar(x,y, color='blue')
#在0位置添加蓝色的线条
plt.axhline(0, color='blue', linewidth=2)

#第一个区域画barh,即x,y对换
plt.subplot(1,2,2)
plt.barh(x,y, color='red')
plt.axvline(0, color='red', linewidth=2)

#显示绘制的图
plt.show()

返回:

 

正值为一种颜色,负值为另一种颜色:

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)
x = np.arange(5)
y = np.random.randint(-5,5,5)

v_bar= plt.bar(x,y, color='blue')

#将y值大于0的设置为蓝色,小于0的设置为绿色
#遍历v_bar对象
#zip()将v_bar和y对应的值对应在一起,通过y的值判断柱的颜色
for bar, height in zip(v_bar, y):
    if height<0:
        bar.set(color='green')

#显示绘制的图
plt.show()

返回:

 

 柱状图使用实例:

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import numpy as np

#准备数据
#三部电影的名称
real_names = ['千与千寻', '玩具总动员', '黑衣人:全球通缉']
#3天票房,三天排名是不同的
real_num1 = [7548, 4013, 1673]
real_num2 = [5453, 1840, 1080]
real_num3 = [4348, 2345, 1890]

x = np.arange(len(real_names))
#绘制柱状图,alpha参数用于显示重叠部分,本来默认为重叠的
plt.bar(x, real_num1, alpha=0.5)
plt.bar(x, real_num2, alpha=0.5)
plt.bar(x, real_num3, alpha=0.5)
#显示绘制的图
plt.show()

返回:

最后:

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import numpy as np

#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['Songti SC']

#准备数据
#三部电影的名称
real_names = ['千与千寻', '玩具总动员', '黑衣人:全球通缉']
#3天票房,三天排名是不同的
real_num1 = [7548, 4013, 1673]
real_num2 = [5453, 1840, 1080]
real_num3 = [4348, 2345, 1890]

x = np.arange(len(real_names))
#绘制柱状图,alpha参数用于显示重叠部分,本来默认为重叠的
#为了让他们不重叠,而是放在旁边,设置为[i+width for i in x]
width = 0.3
plt.bar(x, real_num1, alpha=0.5, width=width, label=real_names[0])
plt.bar([i+width for i in x], real_num2, alpha=0.5, width=width, label=real_names[1])
plt.bar([i+2*width for i in x], real_num3, alpha=0.5, width=width, label=real_names[2])
#添加图例
plt.legend()

#设置x的坐标的值,第一天、第二天、第三天
#为了放在中间,设置为[i+width for i in x]
x_label= ['第{}天'.format(i+1) for i in x]
plt.xticks([i+width for i in x],x_label)

plt.ylabel('票房数')
plt.title('3天3部电影票房数')
#显示绘制的图
plt.show()

返回:

 

饼状图

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import numpy as np

#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['Songti SC']

#准备男生、女生人数及比例
man = 71351
woman = 68187
man_perc = man/(man+woman)
woman_perc = woman/(man+woman)

#添加名称
labels = ['','']
#添加颜色
colors = ['blue', 'red']
#explode=(0,0.05) 将图中间设置一个分裂线
#autopct='%0.1f%%' 显示比例并设置比例显示格式
#paches, texts是labels字体, autotexts是比例字体
paches, texts, autotexts = plt.pie([man_perc, woman_perc], labels=labels, colors=colors, explode=(0,0.05), autopct='%0.1f%%')

#修改字体颜色
for text in autotexts:
    text.set_color('white')

#设置字体大小
for text in texts:
    text.set_fontsize(15)

#显示绘制的图
plt.show()

返回:

 

直方图——关注分布状态

柱状态关注具体的某个值

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import numpy as np

#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['Songti SC']

#生成1000个标准正太分布随机数
x = np.random.randn(1000)

#bins=100, 表示将10个柱放在一起,这样柱子的宽度就比较小了
plt.hist(x, bins=100)

#显示绘制的图
plt.show()

返回:

 

还有normal方法指定期望和正态分布:

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import numpy as np

#不支持中文的解决办法
plt.rcParams['font.sans-serif']=['Songti SC']

#生成1000个,normal方法指定期望和正态分布
x = np.random.normal(0,0.8,1000)
y = np.random.normal(-2,1,1000)
z = np.random.normal(3,2,1000)

#alpha为(01)
kwargs = dict(bins=100, alpha=0.5)
#bins=100, 表示将10个柱放在一起,这样柱子的宽度就比较小了
#plt.hist(x, **kwargs)等价于plt.hist(x, bins=100)
#这样当设置的参数多时,就不用回一个个都写一遍,写一次即可
plt.hist(x, **kwargs)
plt.hist(y, **kwargs)
plt.hist(z, **kwargs)

#显示绘制的图
plt.show()

返回:

 

绘制等高线和三维图

所以100个x和100个y的相交点有10000个

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import numpy as np

#创建x,y
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)

#计算x,y的相交点
X, Y = np.meshgrid(x,y)
Z = np.sqrt(X**2+Y**2)

plt.contour(X,Y,Z)
#显示绘制的图
plt.show()

即哪些x和y相交的点计算得到的Z值是相同的,就连起来画成等高线

返回:

 

还有plt.contourf(X,Y,Z)会填充:

 

三维图

 还要导入3D包:

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
#导入3D包
from mpl_toolkits.mplot3d import Axes3D

X = [1,1,2,2]
Y = [3,4,4,3]
Z = [1,100,1,1]
#该图对象
figure = plt.figure()
#创建Axes3D对象
ax = Axes3D(figure)
ax.plot_trisurf(X,Y,Z)

#显示绘制的图
plt.show()

返回:

 

posted @ 2019-07-16 19:45  慢行厚积  阅读(873)  评论(0编辑  收藏  举报