目录
Matplotlib-Beginner
- 程序结尾处的和plt.show()是显示命令,注意不要忘记括号。
- plt.legend()中的loc=01234,对所有绘图的图例均适用。
- 创建plt.figure()实质是创建了一个窗口,内部有4个边框,实际是没有横纵轴的,(只是一般默认设置为底左侧边框为横纵轴)需要制定两个边框为轴。
- plt.plot是绘制折线图的命令,plt.bar是绘制柱状图命令,plt.scatter散点图,直方图histogram。
- 图像的属性:color颜色,lw线宽,alpha透明度(结合OpenCV内容,仅有png图才有alpha属性)
pytorch预备知识中的plt
import matplotlib.pyplot as plt
import numpy as np
# 线型图
np.random.seed(42)
y = np.random.randn(30)
plt.plot(y,'r:*')
plt.show()
# 总结:表示生成30个服从正态分布的随机数y,并且将其索引作为x坐标绘图。
# 'r--o'表示用red颜色填充,--线性,o形标记点
# 标签和图例
np.random.seed(42)
y1 = np.random.randn(30)
y2 = np.random.randn(30)
plt.title('Example')# 标题
plt.xlabel('x')# 标签
plt.ylabel('y')
y1, = plt.plot(y1,'r--o')# 定义线型并赋值给变量 变量, 此处一定要用 变量,
y2, = plt.plot(y2,'b-*')# 赋值是为了做图例
plt.legend([y1,y2],['y1','y2'],loc=0)# 图例,前列表时保存线性定义的变量,后列表是图例文字描述
plt.show()
# 子图subplot
a = np.random.randn(30)
b = np.random.randn(30)
c = np.random.randn(30)
d = np.random.randn(30)
fig = plt.figure()# 实例化
x1 = fig.add_subplot(2,2,1)# 放在2*2阵的第一个位置
x2 = fig.add_subplot(2,2,2)
x3 = fig.add_subplot(2,2,3)
x4 = fig.add_subplot(2,2,4)
a, = x1.plot(a,'r--o')# 注意区别此处是子图x1.plot()而不是全图plt.plot()
x1.legend([a],'a')# 绘制图例,仍然是子图操作范围内
b, = x2.plot(b,'b-*')
x2.legend([b],'b')
c, = x3.plot(c,'g-.+')
x3.legend([c],'c')
d, = x4.plot(d,'m:x')
x4.legend([d],['d'])
plt.show()# 显示的仍是全图,所以用plt.show()
# 散点图scatter
np.random.seed(42)
y1 = np.random.randn(30)
y2 = np.random.randn(30)
plt.title('Example')
plt.xlabel('x')
plt.ylabel('y')
plt.scatter(y1,y2, color='g',marker='o',label='(x,y)')
plt.legend(loc=0)
plt.show()
# 总结:总体思路区别于线型图,线型图绘图命令是plt.plot(),而散点图绘图命令是
# plt.scatter()。线型图只需要输入y轴的值,而x的值对应的是y值的索引,从而确定一个点;但散点图
# 需要输入x,y的值来确定一个点。
# 直方图histogram
np.random.seed(42)
x = np.random.randn(1000)
plt.title('Example')
plt.xlabel('x')
plt.ylabel('y')
plt.hist(x,bins=20,color='g')
plt.show()
# 总结:直方图绘图命令plt.hist(),区别于散点图,直方图仅需输入一个x值,来统
# 计x的个数y,并设置直方图条纹的数量bins=20,颜色color=绿色
# 饼图pie
plt.title('Example')
labels = ['dogs','cats','birds']
sizes = [15,50,35]
plt.pie(sizes,explode=(0,0,0.1),labels=labels,autopct='%1.1f%%',startangle=90)
plt.axis('equal')
plt.show()
# 饼图pie的制作。核心代码plt.pie(sizes,explode=(0,0,0.1),labels=labels,autopct='%1.1f%%',startangle=90),其中sizes=[15,50,35]中的三个数字确定了每部分数据系列在整个圆形中的占比;explode定义每部分数据系列间的间隔,如果设置前两块为0第三块0.1,意为第三块与左右邻居相距0.1,能突出第3部分;autopct其实就是将sizes中的数据以所定义的浮点精度显示;startangle是绘制第1块饼图时该饼图与x轴正方形夹角,默认为0,此处设为90;plt.axis('equal')必不可少,用于是x轴和y轴的刻度保持一致,只有这样得到的饼图才是圆形。
重要提示:
- 子图subplot的制作。先定义出子图在全图中的位置x1 = fig.add_subplot(2,2,1),后续的操作都是分别基于子图在操作用x1.命令,而非全图操作plt.命令。
- 散点图scatter的制作。线型图绘图命令是plt.plot(),而散点图绘图命令是plt.scatter()。线型图只需要输入y轴的值,而x的值对应的是y值的索引,从而确定一个点;但散点图需要同时输入x,y的值来确定一个点。注意plt.scatter()中的参数:y1,y2的值,color=颜色,marker=点的形状,label=图例。
- 直方图histogram的制作。直方图绘图命令plt.hist(),区别于散点图,直方图仅需输入一个x值,来统计x的个数y。注意plt.histogram()中的参数:x的值,直方图条纹数量bins=20,颜色color=绿色。
- 饼图pie的制作。核心代码plt.pie(sizes,explode=(0,0,0.1),labels=labels,autopct=’%1.1f%%’,startangle=90),其中sizes=[15,50,35]中的三个数字确定了每部分数据系列在整个圆形中的占比;explode定义每部分数据系列间的间隔,如果设置前两块为0第三块0.1,意为第三块与左右邻居相距0.1,能突出第3部分;autopct其实就是将sizes中的数据以所定义的浮点精度显示;startangle是绘制第1块饼图时该饼图与x轴正方形夹角,默认为0,此处设为90;plt.axis(‘equal’)必不可少,用于是x轴和y轴的刻度保持一致,只有这样得到的饼图才是圆形。
1. figure学习(2020.06.11)
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(30)# 获得30个服从正态分布的数
plt.plot(x,'r-o')
plt.show()# 显示索引和生成的随机数
x = np.linspace(-3,3,50)# -3到3间等间距产生50个数
y1 = 2*x+1
y2 = x**2
plt.figure()
plt.title('Example')
plt.plot(x,y1)
plt.show()
plt.figure(num=3,figsize=(8,5))
# 对窗口的设置,窗口名称为figure 3,尺寸figsize=(长,宽)
plt.title('Example')
plt.plot(x,y1)
plt.plot(x,y2,color='r',linewidth=1.0,linestyle='--')
# 横轴值,纵轴值,颜色,线宽,线样式
plt.show()
# 总结:plt.figure()相当于创建了一个窗口,将plt.figure()后且plt.show()之前
# 绘制的所有线都放在该窗口内
重要提示:
- 线条颜色、标记形状、线型在引号中的顺序可更改。
- 制作标题plt.title('Example)、标签plt.xlabel(‘x’) plt.ylabel(‘y’)。
- plt.figure()相当于创建了一个窗口,将plt.figure()后且plt.show()之前绘制的所有线都放在该窗口内。
- 在plt.figure()中可设置窗口的属性,如名字、尺寸等。
- 在绘图命令plt.plot等中,可以设置横轴轴代表的数据,线的颜色,宽度,风格等。
- linewidth可以简写为lw意为线宽
拓展知识:线条颜色、标记形状、线型常用参数如下:
参数 | 线条颜色 |
---|---|
‘b’ | 蓝色blue |
‘g’ | 绿色green |
‘r’ | 红色red |
‘c’ | 蓝绿色 |
‘m’ | 洋红色 |
‘y’ | 黄色yellow |
‘k’ | 黑色black |
‘w’ | 白色white |
参数 | 标记参数点形状 |
---|---|
‘o’ | 实心圆点 |
‘*’ | '*'符号 |
‘+’ | '+'符号 |
‘x’ | 'x’符号 |
参数 | 两点间线条形状 |
---|---|
‘-’ | 实线 |
‘–’ | 虚线 |
‘-.’ | 点实线 |
‘:’ | 点线 |
2. 设置坐标轴(2020.06.11)
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)# -3到3间等间距产生50个数
y1 = 2*x+1
y2 = x**2
plt.figure(num=2.1,figsize=(8,5))# 创建窗口
plt.plot(x,y2)# 画线
plt.plot(x,y1,color='g',linewidth=2.0,linestyle=':')
plt.xlim(-1,2)# 设置横轴范围
plt.ylim(-2,3)
plt.xlabel('价格',fontproperties='SimHei')# 设置横轴标签
# 英文直接写,中文需在后面加上fontproperties属性才能正常显示
plt.ylabel('利润',fontproperties='SimHei')
new_ticks = np.linspace(-1,2,5)#
print (new_ticks)
plt.xticks(new_ticks)# 设置横轴刻度
new_ticks1 = np.linspace(-2,3,5)
plt.yticks(new_ticks1,
[u'非常糟糕','糟糕',r'$good\ \alpha$',r'$really\ good$','超级好'],fontproperties='SimHei')
'''
设置对应坐标用汉字或英文表示,后面的属性fontproperties表示中文可见,不乱码,
内部英文$$表示将英文括起来,r、u可以调整字体(可有可无)
如果要显示特殊字符,比如阿尔法,则用转意符\alpha,前面的\ 表示空格转意
'''
plt.show()
plt.figure(num=.2,figsize=(8,5))
plt.plot(x,y2)
plt.plot(x,y1,color='m',linewidth='2.0',linestyle='-.')
gca = 'get current axis/获取当前轴线'
ax = plt.gca()# 设置边框/坐标轴
ax.spines['right'].set_color('none')# 设置右侧边框颜色为无色,即取消右侧框
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')# 设置横轴为底部边框
ax.yaxis.set_ticks_position('left')
# 设置(0,-1)为原点
ax.spines['bottom'].set_position(('data',-1))# 将x轴(实质是底部边框)放在y=-1的位置
ax.spines['left'].set_position(('data',0))
plt.yticks([-2,-1.8,-1,1.22,3.],
[u'非常糟糕','糟糕',r'$good\ \alpha$',r'$really\ good$','超级好'],fontproperties='SimHei')
plt.show()
# 总结:窗口内本来是没有横纵轴的,只有4条边框,只是后来将其中的两条边框设置为轴
# 一般默认底部边框为x轴,左侧边框为y轴
重要提示:
- 设置轴的范围plt.xlim(a,b),plt.ylim(c,d)。
- 设置轴的标签plt.xlabel(‘x’),plt.ylabel(‘纵轴’,fontproperties=‘SimHei’),注意括号中英文直接写,而中文需补fontproperties=‘SimHei’。cf第三节的图例的中文显示。
- 设置轴的刻度plt.xticks=(),括号中为数组列表,存储横轴的刻度。将刻度值修改为指定内容的方法。
- 处理边框 / 轴的函数ax = plt.gca(),处理边框ax.spines,处理轴ax.xaxis。
- ax.xaxis.set_ticks_position(‘bottom’)将底框设为横轴。
- 修改字体的字母。
- 窗口中的刻度位置似乎都是已经标好的,与轴的位置无关。都是以窗口的正中心为(0,0)点。
3. legend图例(2020.06.11)
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)# -3到3间等间距产生50个数
y1 = 2*x+1
y2 = x**2
plt.figure(num=3,figsize=(8,5))
# 对窗口的设置,窗口名称为figure 3,尺寸figsize=(长,宽)
a, = plt.plot(x,y1)
b, = plt.plot(x,y2,color='r',linewidth=1.0,linestyle='--')
plt.legend(handles=[a,b],labels=['直线','曲线'],loc=4,prop={'family':'SimHei','size':15})
# 注意上两行是a,b,赋值为线型,不要忘了逗号。handles是图,labels是图例名字
# ,loc设置图例在图中的位置,若不指定则默认为0,prop是为了让中文正常显示
plt.show()
重要提示:
- 图例plt.legend(handles=[a,b],labels=[‘直线’,‘曲线’],loc=4,prop={‘family’:‘SimHei’,‘size’:15})的方法,创建图例时,都要将线型赋给:变量 加逗号,的形式,然后在把变量放在图例的列表中。
- 注意是a,b,赋值为线型,不要忘了逗号。handles是图线,labels是图例名字,loc设置图例在图中的位置,若不指定则默认为0,prop是为了让中文正常显示。cf第二节中轴标签和轴刻度的中文显示。
拓展知识:图例位置常用参数如下:
参数 | 图例在图中位置 |
---|---|
loc=0 | 自动寻找最佳位置 |
loc=1 | 强制右上角 |
loc=2 | 强制左上角 |
loc=3 | 强制左下角 |
loc=4 | 强制右下角 |
4. Annotation标注(2020.06.11)
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,20)
y = 2*x+1
plt.figure(num=1,figsize=(8,5))
plt.plot(x,y)
ax = plt.gca()# 处理边框/轴
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
x0 = 1
y0 = 2*x0+1
plt.scatter(x0,y0,s=50,color='b',marker='+')
# 上述命令绘制散点图。s点的大小,color颜色,marker标记形状
plt.plot([x0,x0],[0,y0],'k--',linewidth=2.5)
# 把两个点放入plot,或出连接两点的线,[x0,x0]代表两点的x,[0,y0]代表两点的y
# k--表示黑色虚线,linewidth线宽
# 添加注释 annotate
'''
其中参数xycoords='data' 是说基于数据的值来选位置, xytext=(+30, -30) 和 textcoords='offset points'
对于标注位置的描述 和 xy 偏差值, arrowprops是对图中箭头类型的一些设置.
'''
plt.annotate(r'$2x+1=%s$'%y0,xy=(x0,y0),xycoords='data',xytext=(+30,-30),textcoords='offset points',fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
# 添加注释 text
# 其中-3.7, 3,是选取text的位置, 空格需要用到转字符\ ,fontdict设置文本字体.
plt.text(-3.7,3,r'$This\ is\ the\ some\ text.\mu\ \sigma_i\ \alpha_t$',
fontdict={'size':'16','color':'red'})
plt.show()
重要提示:
- 用plt.plot()连接两点的方法。
- 绘制散点图的命令plt.scatter()。
- 添加注释annotate和text
5. tick能见度(2020.06.11)
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y = 0.1*x
plt.figure()
# 设置 zorder 给 plot 在 z 轴方向排序
plt.plot(x, y, linewidth=10, zorder=1)
plt.ylim(-2, 2)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
# 调整坐标
# 对被遮挡的图像调节相关透明度,本例中设置 x轴 和 y轴 的刻度数字进行透明度设置
for label in ax.get_xticklabels()+ax.get_yticklabels():
label.set_fontsize(12)
'''
其中label.set_fontsize(12)重新调节字体大小,bbox设置目的内容的透明度相关参,
facecolor调节 box 前景色,edgecolor 设置边框, 本处设置边框为无,alpha设置透明度.
'''
# 其中label.set_fontsize(12)重新调节字体大小,bbox设置目的内容的透明度相关参,
# facecolor调节 box 前景色,edgecolor 设置边框, 本处设置边框为无,alpha设置透明度.
label.set_bbox(dict(facecolor='white',edgecolor='none',alpha=0.7))
plt.show()
重要提示:
- 用到了再来看吧,比较复杂。