使用python数据分析、科学计算、数据可视化完成一个作品_第四章:Python科学计算、数据分析、图表可视化库--Matplotlib...

第四章:Python科学计算、数据分析、图表可视化库--Matplotlib

04-Python科学计算、数据分析、图表可视化库

1 Matplotlib入门

1.1 课程目标

01%E8%AF%BE%E7%A8%8B%E7%9B%AE%E6%A0%87.png

1.2 matplotlib安装

pip install matplotlib

conda install matplotlib

1.3 Matplotlib基本绘图方式

03%E5%9F%BA%E6%9C%AC%E7%BB%98%E5%9B%BE%E6%96%B9%E5%BC%8F.png

1.4 绘制第一个图形

importmatplotlib.pyplotasplt

plt.figure(figsize=(8,4))

plt.plot([1,2,3,4,5,6],[123,3,42,5,6,2])

plt.show()

image_1cfgqi71v1s57159edj71cqca0d9.png

1.5 图表美化-加入图例、标题于标签

importmatplotlib.pyplotasplt

plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签

plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号

x1=[1,2,5,8]

y1=[3,7,2,8]

x2=[1,4,7,9]

y2=[4,7,9,11]

plt.plot(x1,y1,label="第一条线")# label关键字设置图例

plt.plot(x2,y2,label="第二条线")

plt.xlabel('x轴')# 设置x轴标签

plt.ylabel('y轴')# 设置y轴标签

plt.title("为图表加入\n图例、标题与标签")# 可以通过转义字符换行

plt.legend()# 显示图例

plt.show()

2 Matplotlib快速进阶

# 导入相关模块,后续不再重复导入

importmatplotlib.pyplotasplt

plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签

plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号

2.1 绘制折线图-py.plot()-默认的绘图方式

05%E7%BB%98%E5%88%B6%E6%8A%98%E7%BA%BF%E5%9B%BE.png

x=[1,2,3,4,5,6,7,8]

y=[2,4,2,5,6,7,4,9]

plt.plot(x,y,label="折线图")

plt.xlabel("x")

plt.ylabel("y")

plt.title("绘制折线图")

plt.legend()

plt.show()

06%E7%BB%98%E5%88%B6%E6%8A%98%E7%BA%BF%E5%9B%BE-2.png

2.2 绘制柱状图/条形图-plt.bar()/plt.barh()

07%E7%BB%98%E5%88%B6%E6%9F%B1%E7%8A%B6%E5%9B%BE%E3%80%81%E6%9D%A1%E5%BD%A2%E5%9B%BE.png

plt.bar([1,3,5,7,9],[2,5,7,3,7],label="柱状图-01")

plt.bar([2,4,6,8,10],[3,1,8,2,6],label="柱状图-02",color='g')

# color参数支持十六进制的颜色代码,如#191970

plt.legend()

plt.xlabel("x轴")

plt.ylabel("y轴")

plt.title("绘制柱状图")

plt.show()

08%E7%BB%98%E5%88%B6%E6%9F%B1%E7%8A%B6%E5%9B%BE%E3%80%81%E6%9D%A1%E5%BD%A2%E5%9B%BE.png

09%E7%BB%98%E5%88%B6%E6%9D%A1%E5%BD%A2%E5%9B%BE.png

ptl.barh()

2.3 绘制直方图 - plt.hist()

10%E7%BB%98%E5%88%B6%E7%9B%B4%E6%96%B9%E5%9B%BE.png

populartion_ages=[22,44,55,66,22,31,41,56,31,21,18,23,22,14,20,67,34,26,78,32,23,56,33,53,32,54,88,65,33,55,32,123,98]# 随机输入的年龄

bins=[0,18,36,54,72,90,108,126]# 人为定义的分割区间

plt.hist(populartion_ages,bins,histtype='bar',label='年龄分布图',rwidth=0.8)

# histtype='bar' 直方图类型为bar

# rwidth设置条形图的宽度,默认为1

plt.xlabel("x轴")

plt.ylabel("y轴")

plt.title("绘制直方图")

plt.legend()

plt.show()

11%E7%BB%98%E5%88%B6%E7%9B%B4%E6%96%B9%E5%9B%BE.png

2.4 绘制饼图 - plt.pie()

12%E7%BB%98%E5%88%B6%E9%A5%BC%E5%9B%BE.png

slices=[7,2,2,13]# 数据

activites=["sleeping","eating","working","playing"]

cols=["c","m","r",'b']

plt.pie(slices,

labels=activites,

colors=cols,

startangle=90,# 指定图形的起始角度

shadow=True,

explode=(0,0.1,0,0),# 指定块突出显示

autopct='%1.1f%%')# 设置显示为百分比

plt.title('饼图')

plt.show()

13%E7%BB%98%E5%88%B6%E9%A5%BC%E5%9B%BE.png

2.5 绘制散点图 - plt.scatter()

14%E7%BB%98%E5%88%B6%E6%95%A3%E7%82%B9%E5%9B%BE.png

x=[1,2,3,4,5,6,7,8]

y=[2,4,1,5,7,9,3,3]

plt.scatter(x,y,label='skitcat',color='g',s=25,marker='o')

# s:参数表示marker的大小

# marker:表示散点的标记符号,更多的设置可以查看官方文档

plt.xlabel("x轴")

plt.ylabel("y轴")

plt.title("绘制散点图")

plt.legend()

plt.show()

16%E7%BB%98%E5%88%B6%E5%A0%86%E5%8F%A0%E5%9B%BE.png

2.6 绘制堆叠图

15%E7%BB%98%E5%88%B6%E5%A0%86%E5%8F%A0%E5%9B%BE.png

days=[1,2,3,4,5]# 代表一周5天

sleeping=[7,8,6,9,8]# 每项活动花费时间记录

eating=[1,2,1,2,1]

working=[9,8,7,8,9]

playing=[7,6,10,5,6]

# 以下代码是为堆叠图设置图例

plt.stackplot(days,sleeping,eating,working,playing,colors=['m','c','r','k'])

plt.plot([],[],color='m',label='sleeping',linewidth=5)

plt.plot([],[],color='c',label='eating',linewidth=5)

plt.plot([],[],color='r',label='working',linewidth=5)

plt.plot([],[],color='k',label='playing',linewidth=5)

plt.xlabel("x轴")

plt.ylabel("y轴")

plt.title("绘制堆叠图(重构)")

plt.legend()

plt.show()

17%E7%BB%98%E5%88%B6%E5%A0%86%E5%8F%A0%E5%9B%BE.png

3 Matplotlib综合演练

importmatplotlib.pyplotasplt

importnumpyasnp

# 以下两行代码可作为通用设置

plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签

plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号

plt.figure(figsize=(10,6))# 设置画布的大小

# 以下一段代码是将坐标轴移到数据零点的标准写法,这里是数据零点,并不是画布的正中间,若数据本身不是有正有负的数据,则一般不用修改

ax=plt.gca()# 通过plt.gca()获得当前的Axes对象ax

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))# 然后把下边界和左边界移到0点

ax.yaxis.set_ticks_position('left')

ax.spines['left'].set_position(('data',0))

X=np.linspace(-np.pi,np.pi,256,endpoint=True)# 通过np.linspace()方法快速获得数据

(C,S)=np.cos(X),np.sin(X)# 分别或的正弦、余弦函数

plt.plot(X,C,'b-',lw=2.5,label='cos函数')# 'b-':color=blue,linestyle=-;'lw':linewidth

plt.plot(X,S,'r-',lw=2.5,label='sin函数')# Sin函数用红色线表示

plt.title("绘制三角函数\n(cos、sin)")

plt.xlim(X.min()*1.4,X.max()*1.4)# 修改画布边缘留白,通过数据值的最大最小值的倍数修改

plt.ylim(C.min()*1.4,C.max()*1.4)

plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],

[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$-\pi/2$',r'$-\pi$'])# 改变坐标轴刻度,改为符号pi

plt.yticks([-1,0,1])# 设置y轴坐标刻度

t=2*np.pi/3# 定义变量

# 以下代码是:画出需要标注的蓝色的线,根据两点之间一条直线

plt.plot([t,t],[0,np.cos(t)],color='blue',linewidth=2.5,linestyle='--')

# 以下代码是:画出需要标注的蓝色的点

plt.scatter([t,],[np.cos(t),],50,color='blue')

# 以下代码是:给蓝色的点添加注释

plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',

xy=(t,np.cos(t)),xycoords='data',

xytext=(-90,-50),textcoords='offset points',fontsize=16,

arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))

# 下同

plt.plot([t,t],[0,np.sin(t)],color='red',linewidth=2.5,linestyle='--')

plt.scatter([t,],[np.sin(t),],50,color='red')

plt.annotate(r'$sin(\frac{2\pi}{3})=-\frac{\sqrt{3}}{2}$',

xy=(t,np.sin(t)),xycoords='data',

xytext=(+10,+30),textcoords='offset points',fontsize=16,

arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))

# 获得所有的x,y轴的刻度值

forlabelinax.get_xticklabels()+ax.get_yticklabels():

label.set_fontsize(16)

# 设置刻度值所在框框的背景色,及框线色、透明度

label.set_bbox(dict(facecolor='c',edgecolor="None",alpha=0.4))

plt.legend(loc='upper left')

# 可以通过loc=关键字将图例定位,可以通过四个方位关键字进行定位:bottom,upper,left,right

plt.show()

18%E4%B8%89%E8%A7%92%E5%87%BD%E6%95%B0%E6%9C%80%E7%BB%88%E5%9B%BE.png

最终效果图

4 Matplotlib高级篇

4.1 高级柱状图/条形图

importmatplotlib.pyplotasplt

importnumpyasnp

plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签

plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号

# 取出一张白纸

fig=plt.figure(1)

# 确定绘图范围,由于只需要画一张图,所以我们将整张白纸作为绘图的范围

ax1=plt.subplot(111)# 111代表图纸分为1行1列,然后在第一块画板进行绘图

# 准备数据

data=np.array([15,20,18,25])

x_bar=np.arange(4)

# 核心图形绘制

# rect=ax1.bar(left=x_bar,height=data,width=0.5,color='lightblue')

#The *left* kwarg to `bar` is deprecated use *x* instead. Support for *left* will be removed in Matplotlib 3.0

rect=ax1.bar(x=x_bar,height=data,width=0.5,color='lightblue')

# 向各条形上添加数据标签

forrecinrect:

x=rec.get_x()

height=rec.get_height()

ax1.text(x+0.2,1.02*height,str(height)+'W')

# 绘制x,y坐标轴刻度及标签,标题

ax1.set_xticks(x_bar)

ax1.set_xticklabels(('第一季度','第二季度','第三季度','第四季度'))

ax1.set_ylabel('销量(单位:万件)')

ax1.set_title('2017年季度销量统计')

ax1.grid(True)

ax1.set_ylim(0,28)

plt.show()

4.2 绘制多幅图形

importmatplotlib.pyplotasplt

plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签

plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号

plt.figure(figsize=(6,6),dpi=80)

plt.figure(1)# 创建第一个画板(figure)

plt.subplot(211)# 划分画板为2行1列,并获取第一块区域

plt.plot([1,2,3])

plt.subplot(212)

plt.plot([4,5,6])

plt.figure(2)# 创建第二个画板

plt.plot([4,5,6])# 在当前画板(第二个画板)绘图。默认子图,等价于subplot(111)

plt.title('第二个画板')

plt.figure(1)# 切换到画板1,但此时subplot(212)仍被调用中

plt.subplot(211)# 切换到第一块区域

plt.title('第一块画板(区域1)')

plt.subplot(212)

plt.title('第一块画板(区域2)')

# 调整每个子图之间的距离

plt.tight_layout()# 不传参数可以自动调整

plt.show()

4.3 matplotlib加载csv数据进行可视化

# 定义空列表存放x,y数据

x,y=[],[]

withopen('data/csv/matplotlib-demo.csv')ascsvfile:

lines=csv.reader(csvfile,delimiter=',')

forlineinlines:

x.append(int(line[0]))

y.append(int(line[1]))

print(x)

print(y)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

[5, 3, 4, 7, 4, 3, 5, 7, 4, 4]

plt.plot(x,y,label='从数据集读取数据\n图表展示')

plt.xlabel('x轴')

plt.ylabel('y轴')

plt.legend()

plt.show()

image_1cgvk900d19861i03dou6fbt139.png

5 Pandas + Matplotlib简化数据可视化

21pandas+matplotlib.png

5.1 在pandas中绘制第一个图形

importpandasaspd

importnumpyasnp

importmatplotlib.pyplotasplt

s=pd.Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))

s.plot()

plt.show()

22%E5%9C%A8pandas%E4%B8%AD%E7%BB%98%E5%88%B6%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%9B%BE.png

5.2 绘制四条折线图

df=pd.DataFrame(np.random.randn(10,4),

columns=list('ABCD'),

index=np.arange(0,100,10))

df.plot()M M33333

plt.show()

将DataFrame中各列的数据分配到不同的子图中 - subplots =True

df.plot(subplots=True)

image_1ch0d9adv1mnq1pc07tb1oob1nut9.png

23.png

5.3 在pandas中的绘图方法

5.3.1 通过Series.plot()方法绘图

24.png

5.3.2 通过DataFrame.plot()方法绘图

25.png

5.4 在pandas中绘制直方图/条形图

importmatplotlib.pyplotasplt

importpandasaspd

importnumpyasnp

fig,axes=plt.subplots(2,1)# 新建一个2行1列的画布

data=pd.Series(np.random.randn(16),

index=list('abcdefghijklmnop'))

data.plot(kind='bar',ax=axes[0],color='k',alpha=0.7)

data.plot(kind='barh',ax=axes[1],color='k',alpha=0.7)

plt.show()

26.png

5.5 在pandas中绘制箱线图

importmatplotlib.pyplotasplt

importpandasaspd

importnumpyasnp

fig=plt.figure()

ax=fig.add_subplot(111)

ax.boxplot(np.random.randn(16))

plt.show()

27.png

5.6 绘制柱状堆积图data.unstack().plot(kind='bar',stacked=True,color=['red','blue'])

# pandas读取excel文件

df=pd.read_excel("excel/pandas-matplotlib.xlsx","Sheet1")

df

image_1ch0daqem2bbufm1bia11u61sbkm.png

5.6.1 年龄分布直方图

#创建一个空白的画板

figure=plt.figure()

#修改已创建的画板的大小

figure.set_size_inches(10,8)

#在画板上添加一个Axes绘图区域

ax=figure.add_subplot(111)

#在选中的绘图区域上绘制一个直方图

ax.hist(df["Age"],bins=7)

plt.title("年龄分布直方图")

plt.xlabel("年龄")

plt.ylabel("人数")

image_1ch0dcal61qb31bmos857i017kn13.png

5.6.2 堆积图

#安装身体状况和性别进行分组后统计销售数量

var=df.groupby(["BMI",'Gender']).Sales.sum()

result=var.unstack()

result

image_1ch0de7lj1jbg4fq152u1fu49o81g.png

result.plot(kind="bar",stacked=True,color=["r","g"])

image_1ch0dff745e1oesup5hg91btv2t.png

5.7 散点图data.scatter(arr1,arr2)

fig=plt.figure()

ax=fig.add_subplot(111)

#根据年龄和销售数据量绘制散点图

ax.scatter(df["Age"],df["Sales"])

plt.show()

image_1ch0dicu9ua1hrm6gg19k830967.png

5.8 气泡图data.scatter(arr1,arr2,s=arr3)

根据arr3对应值的大小来显示不同大小的气泡

#绘制气泡图

fig=plt.figure()

ax=fig.add_subplot(111)

#根据年龄和销售数据量绘制散点图

ax.scatter(df["Age"],df["Sales"],s=df["Income"])

plt.show()

image_1ch0dheo312rn182l13qibao1cpt5q.png

5.9 绘制饼图

#pandas绘制饼图

var=df.groupby("Gender").sum()

x_list=var["Sales"]

label_list=var.index

plt.axis("equal")

plt.pie(x_list,

labels=label_list,

startangle=90,

shadow=True,

explode=[0.05,0],

autopct="%1.1f%%")

plt.show()

image_1ch0dkn64gsgr2l8sa7oq10nj6k.png

6 Matplotlib番外篇 - pyecharts

6.1 pyecharts简介

28pyecharts%E7%AE%80%E4%BB%8B.png

6.2 pyecharts绘制图形

6.2.1 绘制柱状图

importpyecharts

#画简单的柱状图

frompyechartsimportBar

mybar=Bar("主标题","副标题")

# pyecharts遵循所有图表都先定义数据再进行展示

mybar.add("服饰",

["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"],

[5,20,36,10,75,90])

#方法一:将图表渲染输出到html页面中

#savepath文件存储的路径,如果不传入参数,默认保存当前文件所在文件夹下

#mybar.render(savepath)

#方法二:直接再jupyter-notebook中展示

mybar

image_1ch0dnesqmnj17ah7i11s9lsc671.png

#一、柱状图

secondBar=Bar("主标题","副标题")

secondBar.add("服饰",

["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"],

[5,20,36,10,75,90],

is_more_utils=True)

# is_more_utils 是否显示最右侧的工具栏

secondBar

image_1ch0doii71vr414j64gne19n4n7e.png

6.2.2 根据柱状图绘制堆积图

#二、根据柱状图,绘制堆积图

attr=["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋"," 袜子"]

v1=[5,20,36,10,75,90]#商家A的各商品销量

v2=[10,25,8,60,20,80]#商家B各商品的销量

#添加标题

stackBar=Bar("柱状图数据堆叠示例")

#添加数据

stackBar.add("商家A",attr,v1,is_stack=True)

stackBar.add("商家B",attr,v2,is_stack=True)

stackBar

image_1ch0dq75f85616e94qo1k4cbv87r.png

#二、根据柱状图,绘制堆积图

attr=["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋"," 袜子"]

v1=[5,20,36,10,75,90]#商家A的各商品销量

v2=[10,25,8,60,20,80]#商家B各商品的销量

#添加标题

markBar=Bar("柱状图数据堆叠示例")

#添加数据

#柱状图添加标注点

markBar.add("商家A",attr,v1,mark_point=["average"])

#柱状图添加标注线

#is_convert : xy轴互换

markBar.add("商家B",attr,v2,mark_line=["max","min"],is_convert=True)

markBar

image_1ch0dr2kf14vg15ol1kdo1n8d2dm88.png

6.2.3 绘制折线图

#三、绘制折线图

frompyechartsimportLine

attr=["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]

v1=[5,20,36,10,10,100]

v2=[55,60,16,20,15,80]

myLine=Line("折线图示例")

myLine.add("商家A",attr,v1,mark_point=["average","max","min"])

#is_smooth 点之间是否用平滑曲线进行连接

myLine.add("商家B",attr,v2,is_smooth=True)

myLine

image_1ch0dslmv1nli1b161o055fgim28l.png

6.2.4 绘制折线图 - 标注点

#四、折线图修改标注点的形状和标注文字的字体颜色

attr=["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋"," 袜子"]

v1=[5,20,36,10,10,100]

v2=[55,60,16,20,15,80]

markLine=Line("添加标注点的折线图")

markLine.add("商家A",attr,v1,

mark_point=["min","average","max"],

mark_point_symbol="diamond",

mark_point_textcolor="#40ff27")

markLine.add("商家B",attr,v2,

mark_point=["min","average","max"],

mark_point_symbol="arrow",

mark_point_symbolsize=40)

'''

mark_point 标注点

mark_point_symbol 标注点的形状

mark_point_symbolsize 标注点的大小

mark_point_textcolor 标注点的字体颜色

'''

markLine

image_1ch0e0riu8cj1o99ha71cn21f1a92.png

6.2.5 绘制折线图 - 面积图示例

#五、折线图-面积图示例

areaLine=Line("面积图示例")

areaLine.add("商家A",attr,v1,

is_fill=True,

line_opacity=0.2,

area_color="#00ff00",

area_opacity=0.4,

symbol=None)

areaLine.add("商家B",attr,v2,

is_fill=True,

area_color="#000",

area_opacity=0.3,

is_smooth=True)

'''

is_fill 为折线图所包裹的区域填充颜色

area_color 填充的颜色

area_opacity 填充区域背景的不透明度

line_opacity 线条的不透明度

'''

areaLine

image_1ch0e1sgi1g1f1o1d7537dn1lk29f.png

6.2.6 绘制饼图

#六、绘制饼图

frompyechartsimportPie

myPie=Pie("饼图")

myPie.add("",attr,v1,is_label_show=True)

myPie

image_1ch0e2q6ai7mq1ndg1c491l289s.png

6.2.7 饼图 - 圆环图

#七、饼图-圆环图示例

pie=Pie("饼图-圆环图示例",title_pos='center')

pie.add("",attr,v1,is_label_show=True,

radius=[40,75],

label_text_color=None,

legend_orient="vertical",

legend_pos="left")

'''

label_text_color 标签的颜色

legend_orient 图例展开的方向 vertical/horizontal

legend_pos 图例的位置

radius 定义圆环图内圆和外圆的半径

'''

pie

image_1ch0e3s8pc06pvl1v791h946bpa9.png

6.2.8 绘制散点图

#八、绘制散点图

v1,v2# ([5, 20, 36, 10, 10, 100], [55, 60, 16, 20, 15, 80])

frompyechartsimportScatter

myScatter=Scatter("散点图示例")

v1=[10,20,30,40,50,60]

v2=[10,20,30,40,50,60]

#添加数据

myScatter.add("A组",v1,v2,

is_visualmap=True,

visual_type="size",

visual_range_size=[20,80])

myScatter.add("B组",v1[::-1],v2,

is_visualmap=True,

visual_type="size",

visual_range_size=[20,80])

myScatter

image_1ch0e62nt1em213r31ofav3bf4fam.png

6.2.9 绘制地图

#九、绘制地图

frompyechartsimportMap

attr=["福建","山东","北京","上海"]

value=[155,10,66,78]

chinaMap=Map("地图示例",

width=400,

height=150)

chinaMap.add("",attr,value,

maptype="china")

chinaMap.render("china.html")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值