在这一篇章主要讲解用matplotlib工具包画各种图。
写在绘图前面
matplotlib对中文非常不友好,如果你的图像标题或者标签有中文,你就会发现中文部分变成了乱码,而且符号’-‘也会变成框框。’因此如果想解决这个问题,我们需要人工的导入字体或指定字体
Windows
from pylab import mpl
# 指定默认字体
mpl.rcParams['font.sans-serif'] = ['FangSong']
# 解决保存图像是负号'-'显示为方块的问题
mpl.rcParams['axes.unicode_minus'] = False
Mac
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 导入本地字体文件
font = FontProperties(fname='/Library/Fonts/Songti.ttc')
# Fixing random state for reproducibility
np.random.seed(19680801)
# 设置为FALSE 解决负号显示为框的问题
matplotlib.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots()
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
# 用fontproperties参数设置字体为自定义字体
ax.set_title(u'散点图',fontproperties=font,fontsize=30)
plt.show()
画图
说完了,我们可以开始画图了
直方图
直方图的参数只有x!传入横坐标就行!构造函数:
plt.hist(x,bins,normed,color,orientation)
- bins
可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10,其实bins就是指定画出的直方图有几个直方 - normed
如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False。所谓概率密度就是把横坐标发生的数量转换成发生的概率 - color
指定直方图的颜色,如果指定多个颜色,直方图颜色序列会设置成相同的顺序,如果没指定颜色就会使用默认颜色。 - orientation
通过设置orientation为horizontal创建水平直方图。默认值为vertical
例如我们想画一个0到100内随机数分布的概率的水平直方图:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
x=np.random.randint(0,100,size=100)
plt.hist(x,bins=50,normed= True,color='c',orientation='horizontal')
plt.show()
条形图
构造函数:
plt.bar(x,y,width,height)
- x就是横坐标的标签
- width是纵向设置条形宽度,取值0—1
- height 横向设置条形高度
饼图
饼图只有一个参数x!构造函数
plt.pie(x)
参数解释:
- labels参数设置每一块的标签;
- labeldistance参数设置标签距离圆心的距离(比例值,只能设置一个浮点小数)
- autopct参数设置比例值的显示格式(%1.1f%%);
- pctdistance参数设置比例值文字距离圆心的距离
- explode参数设置每一块顶点距圆形的长度(比例值,列表);
- colors参数设置每一块的颜色(列表);
- shadow参数为布尔值,设置是否绘制阴影
- startangle参数设置饼图起始角度
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#搞定中文字体
from pylab import mpl
plt.rcParams['font.sans-serif'] =['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
x=[0.25,0.25,0.5]
plt.pie(x,labels=['男','女','阴阳人'],labeldistance=0.5,pctdistance=0.8,
colors=['b','c','y'],startangle=90)
plt.title('微博网民性别分布')
plt.show()
散点图
接受参数为x,y,x不是x轴刻度而是每个点的横坐标,构造函数:
plt.scatter(x,y,marker=,c=)
- marker指定散点的形状
- c指定散点的颜色
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#搞定中文字体
from pylab import mpl
plt.rcParams['font.sans-serif'] =['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
x=np.random.randint(0,10,20)
y=np.random.randint(0,10,20)
plt.scatter(x,y,marker='+',c='r')
plt.show()
玫瑰图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#搞定中文字体
from pylab import mpl
plt.rcParams['font.sans-serif'] =['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
x=[1,2,3,4,5,6]
plt.axes(polar=True)#这是关键
plt.bar(['a','b','c','d','e','e'],x)
plt.show()
注释
图形内文字注释
plt.text(x=,y=,s=)
- x,y表示注释所在的坐标位置
- s是注释内容
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#搞定中文字体
from pylab import mpl
plt.rcParams['font.sans-serif'] =['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
x=np.linspace(0,2*np.pi,20)
plt.plot(x,np.sin(x),'c-.')
plt.xticks([0,np.pi/2,np.pi,np.pi*3/2,np.pi*2],['0','π/2','π','3π/2','2π'])
plt.text(x=np.pi/2,y=1,s='wdnmd')
plt.show()
高级注释
annotate()
参数解释:
- s注释文字
- xy参数设置箭头指示的位置
- xytext参数设置注释文字的位置
- arrowprops参数以字典的形式设置箭头的样式
- width参数设置箭头长方形部分的宽度
- headlength参数设置箭头尖端的长度,
- headwidth参数设置箭头尖端底部的宽度
- shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值),可以理解为控制箭头的长度
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#搞定中文字体
from pylab import mpl
plt.rcParams['font.sans-serif'] =['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
x=np.linspace(0,2*np.pi,20)
plt.plot(x,np.sin(x),'c-.')
plt.xticks([0,np.pi/2,np.pi,np.pi*3/2,np.pi*2],['0','π/2','π','3π/2','2π'])
a=plt.subplot(111)
a.annotate(s='老八秘制小憨堡',xy=(np.pi/2,1),xytext=(np.pi*2/3,1),arrowprops={'width':3,
'headlength':10,'headwidth':8, 'shrink':1})
plt.show()
君问归期未有期