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为(0,1) 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()
返回: