Jupyter Notebook是一种Web应用,能让用户将说明文本、数学方程、代码和可视化内容全部组合到一个易于共享的文档中。本文例子都是在Jupyter Notebook上完成,Anaconda3自带该工具,直接点击打开。
启动后,在New下拉菜单中选择Python3,就会生成一个代码交互界面。
matplotlib是最流行的用于绘制图表和其它二维数据可视化的Python库。它最初由John D.Hunter(JDH)创建,目前由一个庞大的开发人员团队维护。它非常适合创建出版物上用的图表。
虽然还有其它的Python可视化库,matplotlib却是使用最广泛的,并且它和其它生态工具配合也非常完美。我认为,可以使用它作为默认的可视化工具。
#初始配置
import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False import seaborn as sns import warnings; warnings.filterwarnings(action='once') large = 22; med = 16; small = 12 params = {'axes.titlesize': large, 'legend.fontsize': med, 'figure.figsize': (16, 10), 'axes.labelsize': med, 'axes.titlesize': med, 'xtick.labelsize': med, 'ytick.labelsize': med, 'figure.titlesize': large} plt.rcParams.update(params) plt.style.use('seaborn-whitegrid') sns.set_style("white") %matplotlib inline print(mpl.__version__) print(sns.__version__)
1、画一个圆
import matplotlib.pyplot as plt
#用来正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
#用来正常显示负号
plt.rcParams['axes.unicode_minus']=False
import numpy as np
from matplotlib.font_manager import FontProperties
#设置字体为宋体
font =FontProperties(fname="C:/Windows/Fonts/simsun.ttc",size=14)
#在Jupyter中显示图像
%matplotlib inline
%config InlineBackend.figure_format="retina"
#绘制一个圆形散点图
t=np.arange(1,10,0.05)
x=np.sin(t)
y=np.cos(t)
#定义一个图像窗口,指定比例
plt.figure(figsize=(8,5))
#绘制一条线
plt.plot(x,y,"r-*")
#是坐标轴相等
plt.axis("equal")
plt.xlabel("正弦",fontproperties=font)
plt.ylabel("余弦",fontproperties=font)
plt.title("一个圆形",fontproperties=font)
#显示图像
plt.show()
2、点、线图
#绘制点图或线图
import numpy as np
import matplotlib.pyplot as plt
#生成X
x1=np.linspace(0.0,5.0)
x2=np.linspace(0.0,2.0)
#生成Y
y1=np.cos(2*np.pi*x1)*np.exp(-x1)
y2=np.cos(2*np.pi*x2)
#绘制第一个子图,2表示整个绘图区域分成2行,第一个1表示整个绘图区域分成1列,
#第二个1表示子图的位置在左上(从左到右,从上到下的顺序对每个子区域进行编号)
plt.subplot(2,1,1)
#x1表示x轴数据,y1表示y轴数据,yo-表示曲线格式
plt.plot(x1,y1,'yo-')
plt.title('A tale of 2 subplots')
plt.ylabel('Damped oscillation')
#绘制第二个子图
plt.subplot(2,1,2)
plt.plot(x2,y2,'r.-')
plt.xlabel('time (s)')
plt.ylabel('Undamped')
plt.show()
3、直方图
#绘制直方图
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
mu=100 #分布均值
sigma=15 #分布标准差
x=mu+sigma*np.random.randn(10000)
print("x:",x.shape)
#直方图的条数
num_bins =50
#绘制直方图,x是直方图的一维数组,bins柱数,density向量是否归一化,alpha透明度
#n是直方图向量,bins返回各个bin的区间范围,patche返回没个bin里包含的数据的list
n,bins,patche=plt.hist(x,bins=num_bins,density=1,color='b',alpha=0.5)
#添加一个最佳拟合和曲线
#pdf(x,mu,sigma)返回参数为mu和sigma的正太分布密度函数在x处的值
y=norm.pdf(bins,mu,sigma)
plt.plot(bins,y,'r--')
plt.xlabel('Smarts')
plt.ylabel('Probability')
#在图中添加公式使用latex的语法
plt.title('Histogram of IQ: $mu=100$, $sigma=15$')
#调整图像的间距,防止y轴数值与label重合
plt.subplots_adjust(left=0.15)
plt.show()
print("bind:
",bins)
4、等值线图
#绘制三维图像
import numpy as np
from matplotlib import cm
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#生成数据
delta=0.2
x=np.arange(-3,3,delta)
y=np.arange(-3,3,delta)
X,Y = np.meshgrid(x,y) #生成网格点坐标矩阵
Z=X**2+Y**2
x=X.flatten() #返回一维数组
y=Y.flatten()
z=Z.flatten()
fig=plt.figure(figsize=(12,6)) #figsize设定图片宽高
#cmap指颜色,jet表示蓝-青-黄-红
ax1=fig.add_subplot(121,projection='3d')
ax1.plot_trisurf(x,y,z,cmap=cm.jet, linewidth=0.01)
plt.title("3D")
ax2=fig.add_subplot(122)
#15表示显示等高线的密集程度,数据越大画的等高线越多
cs=ax2.contour(X,Y,Z,15,cmap='jet')
ax2.clabel(cs,inline=True,fontsize=10,fmt='%1.1f')
plt.title("Contour")
plt.show()
4、三维曲面图
#绘制三维图像+各个轴的投影等高线
from matplotlib import cm
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
fig=plt.figure(figsize=(8,6))
ax=fig.gca(projection='3d')
#生成三维测试数据
X,Y,Z=axes3d.get_test_data(0.05)
ax.plot_surface(X,Y,Z,rstride=8,cstride=8,alpha=0.3)
cset=ax.contour(X,Y,Z,zdir='z',offset=-100,cmap=cm.coolwarm)
cset=ax.contour(X,Y,Z,zdir='x',offset=-40,cmap=cm.coolwarm)
cset=ax.contour(X,Y,Z,zdir='y',offset=40,cmap=cm.coolwarm)
ax.set_xlabel('X')
ax.set_xlim(-40,40)
ax.set_ylabel('Y')
ax.set_ylim(-40,40)
ax.set_zlabel('Z')
ax.set_zlim(-100,100)
plt.show()
5、条形图
#绘制条形图
import matplotlib.pyplot as plt
import numpy as np
#生成数据
n_groups=5
#平均分和标准差
means_men=(20,35,30,35,27)
std_men=(2,3,4,1,2)
means_women=(25,32,34,20,25)
std_women=(3,5,2,3,3)
#条形图
fig,ax=plt.subplots()
#生成0,1,2,3,……
index=np.arange(n_groups)
bar_width=0.35 #条的宽度
opacity=0.4
error_config={"ecolor":"0.3"}
#条形图的第一类条
rects1=plt.bar(index,means_men,bar_width,alpha=opacity,color='b',yerr=std_men,
error_kw=error_config,label='Men')
#条形图中的第二类条
rects2=plt.bar(index+bar_width,means_women,bar_width,alpha=opacity,color='r',
yerr=std_women,error_kw=error_config,label='Women')
plt.xlabel('Group')
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(index+bar_width,('A','B','C','D','E'))
plt.legend()
#自动调整subplot的参数给指定的填充区
plt.tight_layout()
plt.show()
6、饼图
#绘制饼图
import matplotlib.pyplot as plt
#切片将顺时针方向排列并绘制
labels='Frogs','Hogs','Dogs','Logs' #标注
sizes=[15,30,45,10] #大小
colors=['yellowgreen','gold','lightskyblue','lightcoral'] #颜色
#0.1代表第二个块从圆中分离出来
explode=(0,0.1,0,0)
#绘制
plt.pie(sizes,explode=explode,labels=labels,colors=colors,
autopct='%1.1f%%',shadow=True,startangle=90)
plt.axis('equal')
plt.show()
7、气泡图
#绘制气泡图
import matplotlib.pyplot as plt
import pandas as pd
#导入数据
df_data=pd.read_csv('D:iris.csv')
df_data.head()
#作图
fig,ax=plt.subplots()
#设置气泡图颜色,颜色数组大小必须跟df_data数组大小一致
colors= np.random.rand(df_data['SepalLength'].size)
#创建气泡图SepalLength为x,SepalWidth为y
ax.scatter(df_data['SepalLength'],df_data['SepalWidth'],
s=df_data['PetalLength']*100, #设置气泡的大小
c=colors,alpha=0.6) #设置颜色透明度
ax.set_xlabel('SepalLength(cm)')
ax.set_ylabel('SepalWidth(cm)')
ax.set_title('PetalLength(cm)*100')
#显示网格
ax.grid(True)
fig.tight_layout()
plt.show()
8、图形灰化
from PIL import Image
#读取图片文件
pil_im=Image.open(r'd:1.png')
#转化为灰度图
Pil_im=pil_im.convert('L')
Pil_im
待续……
初始配置: