07.
多样化的图像
大家好,我是小C,上期给大家分享——Python数据可视化—如何分区和绘图
本期分享内容:Python数据可视化—多样化的图像本期小C邀请的是齐伟(Python大学教材及畅销书作者)为我们分享Python数据可视化。PYTHON
多样化的图像
在上一课,已经了解了基本的绘图方法,特别是熟悉了如何对坐标系做各种各样的设置,那是可视化的基础。本课要在上一课内容的基础上,进一步丰富坐标系内图像的设置。
注意,没有使用曲线这个词,显然包括但不限于曲线。
1.4.1标注
如果在坐标系中绘制了多条曲线,会用图例表示出每条曲线的含义,这是一种区分方式;另外一种方式是直接对每条曲线进行标注,或许这样更直接明了。此外,有时候对于坐标系中某些特殊点也会进行标注。
%matplotlibinlineimportnumpyasnpimportmatplotlib.pyplotaspltx=np.arange(0,10,0.)y=np.exp(-x/2)*np.sin(2*np.pi*x)fig,ax=plt.subplots()ax.plot(x,y)ax.set_xlim(0,10)ax.set_ylim(-1,1)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(zero)#以下标注x1=1.25y1=np.exp(-x1/2)*np.sin(2*np.pi*x1)ax.scatter([x1,],[y1,],50,color=blue)#①ax.plot([x1,x1],[0,y1],color=blue,linewidth=2.5,linestyle="--")#②ax.plot([0,x1],[y1,y1],color=blue,linewidth=2.5,linestyle=--)#③ax.annotate(re^{-\frac{x}{2}}sin(2\pi{x}),x=1.25,xy=(x1,y1),xycoords=data,xytext=(+30,+0.6),textcoords=offsetpoints,fontsize=16,arrowprops=dict(arrowstyle="-",connectionstyle="arc3,rad=.2"))#④
输出结果:
先看输出的结果,相比以往绘制的类似图,此处做了两处改变,一处是坐标系,现在把x轴设置到了y=0的位置,这种设置方法的解释请参考上一课的内容;另外一处是增加了标注,即图中看到的,除了曲线和坐标轴之外,都属于标注的部分。这些内容是通过代码中写有注释的那一行以下的代码实现的,一共4行,下面逐一进行解释。
①的目的在于呈现图中的坐标点,即那个蓝色的圆点。scatter是实现散点图的方法(函数),后面会对此进行详细讲解。请注意这里的参数[x1,],[y1,]。如果用数学方式表示,应该画出的点是(x1,y1),这是一个坐标点。scatter方法的参数跟以前学习过的plot一样,都要输入表示横轴的数据集和表示纵轴的数据集,那么,就要把x1和y1分别放到两个序列中,于是就有了参数[x1,],[y1,]。
②和③的作用就从坐标点(x1,y1)分别向x轴、y轴画出垂直的虚线。
④是标注文字说明,此处使用ax.annotate方法,也可以用plt.annotate函数。
r’e^{-\frac{x}{2}}sin(2\pi{x}),x=1.25
e?2
x
sin(2πx),x=1.25’:这是所显示的内容,在Matplolib中,支持LaTex编辑显示公式。
xy=(x1,y1):说明被标注点的坐标。
xycoords=‘data’:标注内容指向的点,默认值是‘data’,也可以选其他值
xytext=(+30,+0.6):上述文本内容的显示位置。
arrowprops=dict(arrowstyle="-",connectionstyle=“arc3,rad=.2”):箭头的设置。
在坐标系内能够绘制的图像,除了曲线之外,还有很多其他类型的图像,如散点图。1.4.2散点图散点图很重要,是因为在科学研究中,特别是规律探索的过程中,散点图是一种常用的图像。通常发现科学规律的过程是这样进行的:设计实验,通过实验测量得到数据;
将数据在坐标系内做散点图;
观察散点图的特点,推断可能的函数关系,即规律;
再用实验验证规律是否正确,也包括理论上的检验,总之,只要没有发现不符合上述规律的实验数据,就姑且认为该规律是成立的。
当然,上面的过程是以得到一个函数为例说明,有时候画出散点图,或许也不是为了得到某一个函数。
那么,散点图怎么画?
前面已经剧透过了,scatter就是用来画散点图的方法。n=X=np.random.normal(0,1,n)Y=np.random.normal(0,1,n)plt.scatter(X,Y)
输出结果:
X、Y是符合高斯分布的数据(np.random.normal()随机生成符合高斯分布的数字集),然后用plt.scatter()做散点图,从图中可以直观地看到数据的分布,这正是高斯分布的特点。
plt.scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,*,data=None,**kwargs)
scatter的参数中除了x,y必不可少的之外,还有其他很多参数,在后面的绘图中,会用到一些。
importpandasaspdcities=pd.read_csv("/Users/qiwsir/Documents/Codes/DataSet/jiangsu/city_population.csv")cities#outnameareapopulationlongdlatd0南京市...无锡市...徐州市...常州市...苏州市.0..南通市...连云港市...淮安市...盐城市...扬州市.214460119..镇江市...泰州市...宿迁市...96
从数据集中读入上述数据,可以点击这里下载。
变量cities引用的数据集是江苏省各个城市的名称、人口、面积和经纬度数据。下面就要通过可视化的方式,把这些特征体现出来。
lat=cities[latd]lon=cities[longd]population=cities[population],area=cities[area]plt.scatter(lon,lat,label=None,c=np.log10(population)[0],cmap="viridis",s=area/10,linewidths=0,alpha=0.5)plt.axis(aspect=equal)plt.xlabel("longitude")plt.ylabel(latitude)plt.colorbar(label=log_{10}(population))forareain[10,30,50]:plt.scatter([],[],c=k,alpha=0.3,s=area,label=str(area)+km^2)plt.legend(scatterpoints=1,frameon=False,labelspacing=1,title=CityArea)plt.title(江苏省各城市面积和人口)输出结果:此处是按照经纬度来绘制散点图的,因此,各个城市在上图中的位置,应该跟实际地图中的位置一样的。为了对比,请看江苏省的地图。
对比上下两张图,一定会为自己绘制的散点图所折服的。
在心理美滋滋之后,对关键语句进行介绍。
plt.scatter(lon,lat,label=None,c=np.log10(population)[0],cmap=“viridis”,s=area/10,linewidths=0,alpha=0.5):这是绘制散点图的基本函数。scatter参数众多,这里涉及一些,为了理解此行代码,适当解释几个参数。c:设置颜色。在此处使用的值是np.log10(population)[0],因为各个城市population数值较大,用对数对原值进行转换。注意,np.log10(population)的结果是一个形状为(13,1)的数组,因此要以np.log10(population)[0]的方式获得每个城市所对应的色彩,严格来讲只是建立了与色彩的映射关系,具体的色彩还要由cmap决定。
cmap:当用浮点数设置了参数c的值之后,就可以根据此处设置的色彩谱得到相应的色彩。
s:设置每个点的大小,还是考虑到area数值有点大,因此除以10。
linewidths:设置每个点外周的线的粗细。
plt.colorbar(label=‘log_{10}
10
(population)’):这也是一个新面孔,它的作用是生成了图中右侧的数据光谱。对于散点图而言,其中的“点”,除了可以是圆点之外,还可以是别的形状的。比如,下面的代码来自于官方网站的示例。
np.random.seed()x=np.arange(0.0,50.0,2.0)y=x**1.3+np.random.rand(*x.shape)*30.0s=np.random.rand(*x.shape)*+plt.scatter(x,y,s,c="g",alpha=0.5,marker=r\clubsuit,label="Luck")plt.xlabel("Leprechauns")plt.ylabel("Gold")plt.legend(loc=upperleft)
输出结果:
原来的“点”变成了上图中的“树”,其原因就是scatter函数中的maker参数,通过设置其值,能够实现不同形状的“散点”。其他的值可以在官方网站的页面中得到,可点击这里获取。
对于散点图而言,除了在正交的直角坐标系中绘制之外,可能有时候也会在极坐标系中绘制,其他图像也有此可能,但是因为不常用,因此在前面未提及。而散点图,对于极坐标系则是一种比较常见的需要。
np.random.seed()#点的面积和色彩N=r=2*np.random.rand(N)theta=2*np.pi*np.random.rand(N)area=*r**2colors=thetafig=plt.figure()ax=fig.add_subplot(,projection=polar)ax.scatter(theta,r,c=colors,s=area,cmap=hsv,alpha=0.75)
输出结果:
系是通过fig.add_subplot(,projection=‘polar’)里的参数projection=‘polar’建立的,其他方面则与之前的正交坐标系一致了。
虽然这里能够画出色彩斑斓的散点图了,但是,要注意,并不是什么时候都要这样画图的。为每个点或者某些点标明色彩,其实是为了分类,如果没有这种需要,并且是要处理大量数据,推荐使用另外一个——plt.plot。
前面用这个函数绘制的都是曲线,如何用它来绘制散点图?
df=pd.read_csv("/Users/qiwsir/Documents/Codes/DataSet/xsin/xsin.csv")plt.plot(df.x,df.y,Dr)
输出结果:
本例中的数据集来自于: