Files
notes_estom/Python/matplotlab/pyplot_attr.md
2020-09-26 22:03:11 +08:00

279 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 面向对象的绘图方式
## 配置参数
* axex: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示
* figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置
* font: 字体集font family、字体大小和样式设置
* grid: 设置网格颜色和线性
* legend: 设置图例和其中的文本的显示
* line: 设置线条(颜色、线型、宽度等)和标记
* patch: 是填充2D空间的图形对象如多边形和圆。控制线宽、颜色和抗锯齿设置等。
* savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色。
* verbose: 设置matplotlib在执行期间信息输出如silent、helpful、debug和debug-annoying。
* xticks和yticks: 为x,y轴的主刻度和次刻度设置颜色、大小、方向以及标签大小。
## 线条风格
线条风格linestyle或ls | 描述
----|---
- |实线
: |虚线
|破折线
None, , |什么都不画
-. |点划线
## 线条标记
标记maker | 描述
----|----
o |圆圈
. |点
D |菱形
s |正方形
h |六边形1
* |星号
H |六边形2
d |小菱形
_ | 水平线
v |一角朝下的三角形
8 |八边形
< | 一角朝左的三角形
p |五边形
> |一角朝右的三角形
, |像素
^ | 一角朝上的三角形
+ | 加号
\ |竖线
None,, |无
x | X
## 颜色
别名 | 颜色
---|---
b | 蓝色
g |绿色
r |红色
y |黄色
c |青色
k |黑色
m |洋红色
w |白色
## 绘图步骤
```py
#使用numpy产生数据
x=np.arange(-5,5,0.1)
y=x*3
#创建窗口、子图
#方法1先创建窗口再创建子图。一定绘制
fig = plt.figure(num=1, figsize=(15, 8),dpi=80) #开启一个窗口,同时设置大小,分辨率
ax1 = fig.add_subplot(2,1,1) #通过fig添加子图参数行数列数第几个。
ax2 = fig.add_subplot(2,1,2) #通过fig添加子图参数行数列数第几个。
print(fig,ax1,ax2)
#方法2一次性创建窗口和多个子图。空白不绘制
fig,axarr = plt.subplots(4,1) #开一个新窗口并添加4个子图返回子图数组
ax1 = axarr[0] #通过子图数组获取一个子图
print(fig,ax1)
#方法3一次性创建窗口和一个子图。空白不绘制
ax1 = plt.subplot(1,1,1,facecolor='white') #开一个新窗口创建1个子图。facecolor设置背景颜色
print(ax1)
#获取对窗口的引用,适用于上面三种方法
# fig = plt.gcf() #获得当前figure
# fig=ax1.figure #获得指定子图所属窗口
# fig.subplots_adjust(left=0) #设置窗口左内边距为0即左边留白为0。
#设置子图的基本元素
ax1.set_title('python-drawing') #设置图体plt.title
ax1.set_xlabel('x-name') #设置x轴名称,plt.xlabel
ax1.set_ylabel('y-name') #设置y轴名称,plt.ylabel
plt.axis([-6,6,-10,10]) #设置横纵坐标轴范围,这个在子图中被分解为下面两个函数
ax1.set_xlim(-5,5) #设置横轴范围,会覆盖上面的横坐标,plt.xlim
ax1.set_ylim(-10,10) #设置纵轴范围,会覆盖上面的纵坐标,plt.ylim
xmajorLocator = MultipleLocator(2) #定义横向主刻度标签的刻度差为2的倍数。就是隔几个刻度才显示一个标签文本
ymajorLocator = MultipleLocator(3) #定义纵向主刻度标签的刻度差为3的倍数。就是隔几个刻度才显示一个标签文本
ax1.xaxis.set_major_locator(xmajorLocator) #x轴 应用定义的横向主刻度格式。如果不应用将采用默认刻度格式
ax1.yaxis.set_major_locator(ymajorLocator) #y轴 应用定义的纵向主刻度格式。如果不应用将采用默认刻度格式
ax1.xaxis.grid(True, which='major') #x坐标轴的网格使用定义的主刻度格式
ax1.yaxis.grid(True, which='major') #x坐标轴的网格使用定义的主刻度格式
ax1.set_xticks([]) #去除坐标轴刻度
ax1.set_xticks((-5,-3,-1,1,3,5)) #设置坐标轴刻度
ax1.set_xticklabels(labels=['x1','x2','x3','x4','x5'],rotation=-30,fontsize='small') #设置刻度的显示文本rotation旋转角度fontsize字体大小
plot1=ax1.plot(x,y,marker='o',color='g',label='legend1') #点图marker图标
plot2=ax1.plot(x,y,linestyle='--',alpha=0.5,color='r',label='legend2') #线图linestyle线性alpha透明度color颜色label图例文本
ax1.legend(loc='upper left') #显示图例,plt.legend()
ax1.text(2.8, 7, r'y=3*x') #指定位置显示文字,plt.text()
ax1.annotate('important point', xy=(2, 6), xytext=(3, 1.5), #添加标注,参数:注释文本、指向点、文字位置、箭头属性
arrowprops=dict(facecolor='black', shrink=0.05),
)
#显示网格。which参数的值为major(只绘制大刻度)、minor(只绘制小刻度)、both默认值为major。axis为'x','y','both'
ax1.grid(b=True,which='major',axis='both',alpha= 0.5,color='skyblue',linestyle='--',linewidth=2)
axes1 = plt.axes([.2, .3, .1, .1], facecolor='y') #在当前窗口添加一个子图rect=[左, 下, 宽, 高],是使用的绝对布局,不和以存在窗口挤占空间
axes1.plot(x,y) #在子图上画图
plt.savefig('aa.jpg',dpi=400,bbox_inches='tight') #savefig保存图片dpi分辨率bbox_inches子图周边白色空间的大小
plt.show() #打开窗口对于方法1创建在窗口一定绘制对于方法2方法3创建的窗口若坐标系全部空白则不绘制
```
## plot属性
```py
属性 值类型
alpha 浮点值
animated [True / False]
antialiased or aa [True / False]
clip_box matplotlib.transform.Bbox 实例
clip_on [True / False]
clip_path Path 实例 Transform以及Patch实例
color or c 任何 matplotlib 颜色
contains 命中测试函数
dash_capstyle ['butt' / 'round' / 'projecting']
dash_joinstyle ['miter' / 'round' / 'bevel']
dashes 以点为单位的连接/断开墨水序列
data (np.array xdata, np.array ydata)
figure matplotlib.figure.Figure 实例
label 任何字符串
linestyle or ls [ '-' / '--' / '-.' / ':' / 'steps' / ...]
linewidth or lw 以点为单位的浮点值
lod [True / False]
marker [ '+' / ',' / '.' / '1' / '2' / '3' / '4' ]
markeredgecolor or mec 任何 matplotlib 颜色
markeredgewidth or mew 以点为单位的浮点值
markerfacecolor or mfc 任何 matplotlib 颜色
markersize or ms 浮点值
markevery [ None / 整数值 / (startind, stride) ]
picker 用于交互式线条选择
pickradius 线条的拾取选择半径
solid_capstyle ['butt' / 'round' / 'projecting']
solid_joinstyle ['miter' / 'round' / 'bevel']
transform matplotlib.transforms.Transform 实例
visible [True / False]
xdata np.array
ydata np.array
zorder 任何数值
```
## 多图绘制
```py
#一个窗口,多个图,多条数据
sub1=plt.subplot(211,facecolor=(0.1843,0.3098,0.3098)) #将窗口分成2行1列在第1个作图并设置背景色
sub2=plt.subplot(212) #将窗口分成2行1列在第2个作图
sub1.plot(x,y) #绘制子图
sub2.plot(x,y) #绘制子图
axes1 = plt.axes([.2, .3, .1, .1], facecolor='y') #添加一个子坐标系rect=[左, 下, 宽, 高]
plt.plot(x,y) #绘制子坐标系,
axes2 = plt.axes([0.7, .2, .1, .1], facecolor='y') #添加一个子坐标系rect=[左, 下, 宽, 高]
plt.plot(x,y)
plt.show()
```
## 极坐标
```py
fig = plt.figure(2) #新开一个窗口
ax1 = fig.add_subplot(1,2,1,polar=True) #启动一个极坐标子图
theta=np.arange(0,2*np.pi,0.02) #角度数列值
ax1.plot(theta,2*np.ones_like(theta),lw=2) #画图参数角度半径lw线宽
ax1.plot(theta,theta/6,linestyle='--',lw=2) #画图参数角度半径linestyle样式lw线宽
ax2 = fig.add_subplot(1,2,2,polar=True) #启动一个极坐标子图
ax2.plot(theta,np.cos(5*theta),linestyle='--',lw=2)
ax2.plot(theta,2*np.cos(4*theta),lw=2)
ax2.set_rgrids(np.arange(0.2,2,0.2),angle=45) #距离网格轴,轴线刻度和显示位置
ax2.set_thetagrids([0,45,90]) #角度网格轴范围0-360度
plt.show()
```
## 柱状图
```py
plt.figure(3)
x_index = np.arange(5) #柱的索引
x_data = ('A', 'B', 'C', 'D', 'E')
y1_data = (20, 35, 30, 35, 27)
y2_data = (25, 32, 34, 20, 25)
bar_width = 0.35 #定义一个数字代表每个独立柱的宽度
rects1 = plt.bar(x_index, y1_data, width=bar_width,alpha=0.4, color='b',label='legend1') #参数:左偏移、高度、柱宽、透明度、颜色、图例
rects2 = plt.bar(x_index + bar_width, y2_data, width=bar_width,alpha=0.5,color='r',label='legend2') #参数:左偏移、高度、柱宽、透明度、颜色、图例
#关于左偏移,不用关心每根柱的中心不中心,因为只要把刻度线设置在柱的中间就可以了
plt.xticks(x_index + bar_width/2, x_data) #x轴刻度线
plt.legend() #显示图例
plt.tight_layout() #自动控制图像外部边缘,此方法不能够很好的控制图像间的间隔
plt.show()
```
## 直方图
```py
fig,(ax0,ax1) = plt.subplots(nrows=2,figsize=(9,6)) #在窗口上添加2个子图
sigma = 1 #标准差
mean = 0 #均值
x=mean+sigma*np.random.randn(10000) #正态分布随机数
ax0.hist(x,bins=40,normed=False,histtype='bar',facecolor='yellowgreen',alpha=0.75) #normed是否归一化histtype直方图类型facecolor颜色alpha透明度
ax1.hist(x,bins=20,normed=1,histtype='bar',facecolor='pink',alpha=0.75,cumulative=True,rwidth=0.8) #bins柱子的个数,cumulative是否计算累加分布rwidth柱子宽度
plt.show() #所有窗口运行
```
## 散点图
```py
fig = plt.figure(4) #添加一个窗口
ax =fig.add_subplot(1,1,1) #在窗口上添加一个子图
x=np.random.random(100) #产生随机数组
y=np.random.random(100) #产生随机数组
ax.scatter(x,y,s=x*1000,c='y',marker=(5,1),alpha=0.5,lw=2,facecolors='none') #x横坐标y纵坐标s图像大小c颜色marker图片lw图像边框宽度
plt.show() #所有窗口运行
```
## 三维图
```py
fig = plt.figure(5)
ax=fig.add_subplot(1,1,1,projection='3d') #绘制三维图
x,y=np.mgrid[-2:2:20j,-2:2:20j] #获取x轴数据y轴数据
z=x*np.exp(-x**2-y**2) #获取z轴数据
ax.plot_surface(x,y,z,rstride=2,cstride=1,cmap=plt.cm.coolwarm,alpha=0.8) #绘制三维图表面
ax.set_xlabel('x-name') #x轴名称
ax.set_ylabel('y-name') #y轴名称
ax.set_zlabel('z-name') #z轴名称
plt.show()
```
## 集合图形
```py
fig = plt.figure(6) #创建一个窗口
ax=fig.add_subplot(1,1,1) #添加一个子图
rect1 = plt.Rectangle((0.1,0.2),0.2,0.3,color='r') #创建一个矩形,参数:(x,y),width,height
circ1 = plt.Circle((0.7,0.2),0.15,color='r',alpha=0.3) #创建一个椭圆,参数:中心点,半径,默认这个圆形会跟随窗口大小进行长宽压缩
pgon1 = plt.Polygon([[0.45,0.45],[0.65,0.6],[0.2,0.6]]) #创建一个多边形,参数:每个顶点坐标
ax.add_patch(rect1) #将形状添加到子图上
ax.add_patch(circ1) #将形状添加到子图上
ax.add_patch(pgon1) #将形状添加到子图上
fig.canvas.draw() #子图绘制
plt.show()
```