python数据可视化(matplotlib,seaborn,plotly)

Posted 鈴音.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python数据可视化(matplotlib,seaborn,plotly)相关的知识,希望对你有一定的参考价值。

资料链接

B站云开见明-python可视化
https://www.bilibili.com/video/BV1eJ411H79t?p=8&share_source=copy_web

博客里用到的数据和代码:
链接:https://pan.baidu.com/s/1r5JJdZzrCejgy9NGXbsFQQ
提取码:mxmf

Matplotlib绘图基础

matplotlib官网
plt.plot(xy,ls=,lwe=,c=,marker=,markersize=,markeredgecolor-,markerfacecolor, label=)

  • x∶x轴上的数值
  • y∶ y轴上的数值
  • ls∶折线的风格(‘-’,‘–’,‘-.’,‘:’)
  • lw∶ 线条宽度
  • c∶ 颜色
  • marker∶线条上点的形状
  • markersize∶线条上点的大小
  • markeredgecolor∶点的边框色
  • markerfacecolor∶点的填充色
  • label∶文本标签
import numpy as np
import matplotlib.pyplot as plt
#确保图形能正确展示处理
%matplotlib inline
x=np.linspace(0,100,1000)
y=np.sin(x)
#plt.plot()绘制折线图
#c线条颜色 lw线条宽度 ls线条风格
#plt.show()展现图形
plt.plot(x,y,c='red',lw=2,ls='--')
plt.show()

#marker点的形状 markersize点的大小 markeredgecolor点的边框颜色
#markerfacecolor点的实心填充色
plt.plot(x,y,ls='-',marker='o',markersize=5,c='red'
         ,markeredgecolor='blue',markerfacecolor='w',
        label='x和y的关系')
plt.show()

plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码
plt.rcParams['axes.unicode_minus']=False#解决符号乱码
x=np.linspace(0,10,100)
y=np.sin(x)
plt.plot(x,y,ls=':',lw=2,label='y=sin(x)')
plt.legend(loc='upper center')#展示图例 loc位置关系 loc还可为center等

x=np.arange(0,1.1,0.01)
y=x**2
#figsize画布大小dpi分辨率facecolor画布边框色
plt.figure(figsize=(4,4),dpi=100,facecolor='white')
plt.title('这是一幅画')
plt.xlabel('x1')#标签
plt.ylabel('y')
plt.xlim=([0,1])#范围
plt.ylim([0,1])
plt.xticks([0,0.2,0.4,0.6,0.8,1])#刻度
plt.yticks([0,0.2,0.4,0.6,0.8,1])
plt.plot(x,y,label='y=x^2')
plt.legend(loc='best')
#保存图片,名称可为png,pdf
plt.savefig(r'C:\\Users\\郝琪英\\Desktop\\可视化.pdf')
plt.show()

简单图形绘制

1.饼图

饼图用于实现可视化离散型变量的分布的一种图形

pie(x,explode,labels,colors,autopct=,pctdistance,shadow,startangle,radius,wedgeprops,textprops,center)

  • labels∶标签
  • colors∶颜色
  • autopct∶百分比
  • pctdistance∶百分比标签与圆心距离
  • shadow∶是否添加饼图阴影效果
  • labeldistance∶设置各扇形标签与圆心距离
  • startangle∶设置饼图的初始摆放角度
  • radius∶设置饼图半径大小
  • counterclock∶是否逆时针呈现
  • wedgeprops∶设置饼图内外边界的属性
  • textprops∶设置饼图中文本属性
  • center∶设置中心位置
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import os
os.chdir('.\\数据')
data=pd.read_excel('非洲通讯产品销售数据.xlsx',sheet_name='SalesData')
data.head()
data_1=data.groupby('地区').mean()['销售额']
x_data=data_1.values
y_data=data_1.index
#每部分突出大小
explode = [0,0,0,0,0.1]
colors=['red','blue','purple','green','darkred']#purple
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#autopct设置为百分比格式 pctdistance百分比标签与圆心距离
#labeldistance设置文本标签与圆心距离 startangle设置饼图初始角度
#radius设置饼图半径 counterclock是否逆时针
#wedgeprops边的宽度以及边框色textprops文本信息

#官网:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html

plt.pie(x=x_data,explode=explode,labels=y_data,colors=colors,
       autopct='%.1f%%',pctdistance=0.5,labeldistance=1.1,
       startangle=120,radius=1.2,counterclock=False,
       wedgeprops='linewidth':1.2,'edgecolor':'green',
       textprops='fontsize':10,'color':'black')
# plt.title('订单金额分布图')#pad标题距离坐标轴距离
plt.show()

2.条形图

饼图不适合取值过多的分类特征,条形图不仅适合分类水平较多的变量也更加适合对比差异.具体请见案例
bar(x, y,width,bottom,color,linewidth,tick_label,align)

  • x指定x轴上数值
  • y指定y轴上数值
  • width指定条形图宽度
  • color条形图的填充色
  • edge条形图的边框色
  • linewidth条形图边框宽度
  • tick_label条形图的刻度标签
  • align指定x轴上对齐方式
x_data=data_1.values
y_labels=data_1.index
plt.bar(x=range(0,len(x_data)),height=x_data,align='center',
       color='y',tick_label=y_labels)
plt.xlabel('地区',labelpad=10)
plt.ylabel('销售额',labelpad=10)
plt.title('不同地区的销售额')
plt.show()

3.直方图

对于连续型变量,往往需要查看其分布图,直方图就是用来观察数据的分布形态plt.hist(x,bins,range,normed,cumulative,bottom,align,rwidth,color,edgecolor,label)

  • x数据
  • bin条形个数
  • range上下界
  • normed是否将频数转换成频率
  • cumulative是否计算累计频率
  • bottom为直方图的每个条形添加基准线,默认为0
  • align对齐方式
  • rwidth条形的宽度
  • color填充色
  • edgecolor设置直方图边框色
  • label设置直方图标签
data.head()

#销售额在某一区间内出现的次数
#bin格子的个数 density是否以频数的形式展示
plt.hist(x=data['销售额'],bins=30,color='r',edgecolor='black',
         density=False)
plt.title('销售额分布图')
plt.show()

4.散点图

散点图一般用来展示2个连续型变量的的关系,可以通过散点图来判断两个变量之间是否存在某种关系,例如线性还是非线性关系

plt.scatter(x,y, s, c, marker, cmap, norm, alpha, linewidths, edgecolorsl)

  • x x数据
  • y y轴数据
  • s 散点大小
  • c 散点颜色
  • marker 散点图形状
  • cmap 指定某个colormap值,该参数一般不用,用默认值
  • alpha 散点的透明度
  • linewidths 散点边界线的宽度
  • edgecolors 设置散点边界线的颜色

SalePrice - 以美元为单位的房产销售价格。
LotArea:以平方英尺为单位的地块面积

sec_buildings=pd.read_csv('train.csv')
sec_buildings.head()
#SalePrice - 以美元为单位的房产销售价格。
#LotArea:以平方英尺为单位的地块面积
plt.scatter(x=sec_buildings['LotArea'],
            y=sec_buildings['SalePrice'],
            color='steelblue',marker='o',s=100)
plt.xlabel('房子大小',fontsize=14)
plt.ylabel('房子总价',fontsize=14)
plt.title('房子大小和房子总价关系',fontsize=14)
plt.show()

图形基本设置

plt.plot(data_1.index,data_1.values,label='不同地区销售额')
#loc='best'根据图自动匹配最好位置 frameon是否有边框
plt.legend(loc='upper left',fontsize=12,frameon=True)
#设置图像
# fig=plt.gcf()
# fig.set_size_inches(12.5,10.5)#调整图片大小(画布长宽)
# plt.grid(ls='--',c='red')#  -,-.,--.:
plt.axhline(y=500,c='red',ls='--',lw=2)#画线y=500
plt.axvline(x=2,c='red',ls='--',lw=2)#画线x=2
plt.show()

plt.plot(data_1.index,data_1.values,label='不同地区销售额')
#loc='best'根据图自动匹配最好位置 frameon是否有边框
plt.legend(loc='upper left',fontsize=12,frameon=True)
#alpha参数透明度,可给可不给
plt.axvspan(xmin=3,xmax=5,facecolor='r',alpha=0.3)#画出x为3-5的区域
plt.axhspan(ymin=480,ymax=510,facecolor='r',alpha=0.3)#画出y为480-510的区域
plt.show()

统计图形实战

1.柱状图(堆积柱状图)

柱状图主要应用在定性数据的可视化场景里面,或者是分类特征的分布展示,那么由柱状图衍生出来的图形还有堆积柱状图,多数据并列柱状图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
GDP=pd.read_excel('Province GDP 2017.xlsx')
GDP

plt.figure(figsize=(6.4,4.8))
plt.bar(x=GDP.index.values,height=GDP.GDP,width=0.5)
#rotation字体旋转倾斜
plt.xticks(GDP.index.values,GDP.Province,rotation=45)
plt.xlabel('省份',fontsize=14)
plt.ylabel('GDP产值(万亿)',fontsize=14,labelpad=20)
plt.title('2017年GDP情况',fontsize=20)
plt.show()

Industry_GDP=pd.read_excel('Industry_GDP.xlsx')
Industry_GDP

#透视表
temp=pd.pivot_table(data=Industry_GDP,index='Quarter',columns='Industry_Type',
                   values='GDP',aggfunc=np.sum)
temp

#tick_label为行索引打标签,把Q1,Q2,Q3,Q4变为'第一季度','第二季度','第三季度','第四季度'
#bottom表示第二产业是在第一产业上面的,第三产业在第一产业和第二产业之上的,由堆叠图可看出
plt.bar(x=temp.index.values,height=temp['第一产业'],color='steelblue',
       label='第一产业',tick_label=['第一季度','第二季度','第三季度','第四季度'],)
plt.bar(x=temp.index.values,height=temp['第二产业'],color='green',
       label='第二产业',bottom=temp['第一产业'],tick_label=['第一季度','第二季度','第三季度','第四季度'],)
plt.bar(x=temp.index.values,height=temp['第三产业'],color='red',
       label='第三产业',bottom=temp['第一产业']+temp['第二产业'],tick_label=['第一季度','第二季度','第三季度','第四季度'])
plt.ylabel('产值(亿)')
plt.title('2017年各行业各季度生产值')
plt.show()

temp=pd.crosstab(Industry_GDP['Quarter'],Industry_GDP['Industry_Type'],
                values=Industry_GDP['GDP'],aggfunc=np.sum,normalize='index')
temp

#tick_label为行索引打标签,把Q1,Q2,Q3,Q4变为'第一季度','第二季度','第三季度','第四季度'
#bottom表示第二产业是在第一产业上面的,第三产业在第一产业和第二产业之上的,由堆叠图可看出
plt.bar(x=temp.index.values,height=temp['第一产业'],color='steelblue',
       label='第一产业',tick_label=['第一季度','第二季度','第三季度','第四季度'],)
plt.bar(x=temp.index.values,height=temp['第二产业'],color='green',
       label='第二产业',bottom=temp['第一产业'],tick_label=['第一季度','第二季度','第三季度','第四季度'],)
plt.bar(x=temp.index.values,height=temp['第三产业'],color='red',
       label='第三产业',bottom=temp['第一产业']+temp['第二产业'],tick_label=['第一季度','第二季度','第三季度','第四季度'])
plt.ylabel('产值(亿)')
plt.title('2017年各行业各季度生产值')
plt.legend(loc='best')
plt.show()
#从图中可看出蓝色部分第一产业,四个季度依次上升
#红色部分第三产业四个季度产值下降了

#修改图例到最右边
plt.bar(x=temp.index.values,height=temp['第一产业'],color='steelblue',
       label='第一产业',tick_label=['第一季度','第二季度','第三季度','第四季度'],)
plt.bar(x=temp.index.values,height=temp['第二产业'],color='green',
       label='第二产业',bottom=temp['第一产业'],tick_label=['第一季度','第二季度','第三季度','第四季度'],)
plt.bar(x=temp.index.values,height=temp['第三产业'],color='red',
       label='第三产业',bottom=temp['第一产业']+temp['第二产业'],tick_label=['第一季度','第二季度','第三季度','第四季度'])
plt.ylabel('产值(亿)')
plt.title('2017年各行业各季度生产值')
#把横轴看为1,纵轴看为1,
#1.08表示距离纵轴的距离
#0.8表示距离横轴的距离
plt.legend(bbox_to_anchor=(1.08,0.8))
plt.show()

2.直方图(直方图,核密度图,正态分布图)

直方图,一般用来观察数据的分布形态,横坐标代表数值的分段,纵坐标代表了观测数量和频数,直方图有时候会和核密度图搭配使用,主要是为了更加详细的展示数据的分布特征

Titanic=pd.read_csv('titanic_train.csv')
#删除掉年龄的缺失值
Titanic.dropna(subset=['Age'],inplace=True)
#density=True频率形式展现
plt.hist以上是关于python数据可视化(matplotlib,seaborn,plotly)的主要内容,如果未能解决你的问题,请参考以下文章

python数据可视化(matplotlib)

Python 数据可视化之-[Matplotlib]

Python 数据可视化之-[Matplotlib]

Python数据可视化之Matplotlib实现各种图表

python数据可视化matplotlib的使用

Python数据可视化之matplotlib