4. Python数据可视化

4.1 Matplotlib绘图

4.1.1 matplotlib基本用法

  • 状态接口
import pandas as pd
import matplotlib.pyplot as plt

x = [-3, 5, 7] #准备数据的x轴坐标
y = [10, 2, 5] #准备数据的y轴坐标

plt.figure(figsize=(15,3)) #figure 创建画布  figsize指定画布大小
plt.plot(x, y) #plot 绘图
plt.xlim(0, 10) #xlim 设置x轴坐标的范围
plt.ylim(-3, 8) #ylim 设置y轴坐标的范围
plt.xlabel('X Axis',size=20) # 设置x轴标签  size字体大小
plt.ylabel('Y axis') # 设置y轴标签
plt.title('Line Plot',size=30) # 设置标题内容, size 字体大小
复制代码
  • 面向对象
import pandas as pd
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(15,3))  #创建坐标轴对象
ax.plot(x, y) #调用坐标轴的绘图方法
ax.set_xlim(0, 10) # 调用坐标轴的设置x轴上下限的方法
ax.set_ylim(-3, 8) 
ax.set_xlabel('X axis') # 调用坐标轴的设置x轴标签的方法
ax.set_ylabel('Y axis',size = 20) # 调用坐标轴的设置y轴标签的方法
ax.set_title('Line Plot',size = 30) # 调用坐标轴的设置标题的方法
复制代码

4.1.2 单变量频数统计直方图axes.hist()

axes1.hist(df['列名'], bins=10) # bins=10把所有数据分组为10组【装箱操作】
复制代码

4.1.3 axes.scatter()双变量散点图用于表示一个连续变量随另一个连续变量的变化所呈现的大致趋势

axes1.scatter(x=df['列名1'], y=df['列名2'])
复制代码

4.1.4 axes.scatter()通过散点不同的颜色大小来表示与二维数据关联的第34维度的数据

axes1.scatter(
    x=df['列名1'], # x轴数据
    y=df['列名2'], # y轴数据
    s=df['列名3'], # 接收散点的大小,df['列名3']是由数字构成的,不同的数字来表示散点的大小
    c=df['列名4'], # 颜色区分,df['列名4']是由数字构成的,不同的数字来表示散点的颜色
    alpha=0.5 # 散点的透明度
)
复制代码

4.2 Pandas绘图

4.2.1 bar柱状图

df['列名'].plot.bar(
    figsize=(16,8), # 图表大小
    fontsize=20, # 字体大小
    color=['red', 'orange', 'blue', ...] # 柱状颜色设置
)
复制代码

4.2.2 line折线图

<series OR df>.plot.line(
    figsize=(16,8), # 图表大小
    fontsize=20, # 字体大小
    color=['red', 'orange', 'blue', ...] # 柱状颜色设置
)
复制代码

4.2.3 area面积图

<series OR df>.plot.area(
    figsize=(16,8), # 图表大小
    fontsize=20, # 字体大小
    color=['red', 'orange', 'blue', ...] # 柱状颜色设置
)
复制代码

4.2.4 hist直方图

<series OR df>.plot.hist(bins=2) # bins=2 表示2个一组         
复制代码

4.2.5 pie饼图

df['列名'].plot.pie()
复制代码

4.2.6 scatter散点图

  • 散点图最适合使用相对较小的数据集以及具有大量唯一值的变量
df.plot.scatter(x='列名1', y='列名2')
复制代码

4.2.7 hexbin蜂巢图

  • 蜂巢格子颜色深度表示该范围内数据的条数
df.plot.hexbin(x='列名1', y='列名2', gridsize=15) # gridsize控制蜂巢格子的大小
复制代码

4.2.8 bar(stacked=True)堆叠图

df.plot.bar(stacked=True)
复制代码

4.2.9 barh水平柱状及堆叠图

df['列名'].barh() # 水平柱状
df.plot.barh(stacked=True) # 水平堆叠
复制代码

4.3 Seaborn绘图

4.3.1 单变量

展示变量的分布情况

  • 直方密度频数图
ax = sns.distplot(df['列名']) # 直方加密度曲线
ax = sns.distplot(df['列名'], rug=True) # 直方加密度,再加频数线
ax = sns.distplot(df['列名'], kde=False) # 直方图
ax = sns.distplot(df['列名'], hist=False) # 密度曲线图
复制代码
  • 条形计数图

    • 展示指定列中不同的值出现的次数
ax = sns.countplot(df['列名'])
复制代码

4.3.2 双变量

  • 散点图与蜂巢图
ax = sns.regplot(x=df['列名1'], y=df['列名2'])
fig = sns.lmplot(x=df['列名1'], y=df['列名2'], fit_reg=True) # fit_reg=True表示展示拟合线
# jointplot在每个轴上创建包含单个变量直方图的散点图
ax = sns.jointplot(x=df['列名1'], y=df['列名2']) 
# 蜂巢图
ax = sns.jointplot(x=df['列名1'], y=df['列名2'], kind='hex')
复制代码
  • 2D密度(等高线)图
ax = sns.kdeplot(data=df['列名1'], data2=df['列名2'], shade=True, kind='kde') 
# shade=True是否填充轮廓
# kind='kde' 加上kde密度线
复制代码
  • 条形图
ax = sns.barplot(x=df['列名1'], y=df['列名2']) 
复制代码
  • 箱线图

    • 箱线图用于显示多种统计信息:最小值,1/4分位,中位数,3/4分位,最大值
ax = sns.boxplot(x=df['列名1'], y=df['列名2']) 
复制代码
  • 小提琴图

    • 在箱线图的基础上能够显示数据量的多少
ax = sns.violinplot(x=df['列名1'], y=df['列名2']) 
复制代码
  • 成对关系图

    • 能够将df中所有或指定的数值类型的列,成对的进行组合展示两者之间的关系
sns.pairplot(df) # 全部数值列进行两两组合
sns.pairplot(df, vars=['列名1', '列名2']) # 指定要组合展示的列名
复制代码
  • 自定义图表类型,按右上、左下、中间轴线(左上至右下)的方式分别设置
pair_grid = sns.PairGrid(df)
pair_grid.map_upper(sns.regplot) # 右上设为reg,并自动添加拟合回归线
pair_grid.map_lower(sns.kdeplot) # 左下设为kde密度图,散点会变成2D密度图
pair_grid.map_diag(sns.kdeplot) # 中间轴线上的图设为kde密度图,柱状图会变成一维的密度图
# 可以指定的图类型有:
#sns.histplot
#sns.barplot
#sns.jointplot 部分版本存在展示问题
#sns.kdeplot
#sns.regplot
复制代码

4.3.3 特殊参数

  • 多变量通过颜色、大小和形状区分

    • hue参数指定列,该列中不同的值即可展现出不同的颜色
    • size参数指定列,列中不同的值展现出不同大小
    • style参数指定列,列中不同的值展现出不同形状
ax = sns.violinplot(x=df['列名1'], y=df['列名2'], hue='列名3')
ax = sns.lmplot(x=df['列名1'], y=df['列名2'], fit_reg=True, hue='列名3') # fit_reg=True表示展示拟合线
ax = sns.pairplot(tips, hue='列名3')
ax.relplot(x="列名1", y="列名2", data=df, hue="列名3", style="列名4", size="列名5")
复制代码
  • 分图展示col与col_wrap参数

    • col参数指定列,根据该列中不同的值做分组,每组数据单独展示为一个图表
    • col_wrap参数指定每行多少个图表
sns.lmplot(x='列名1', y='列名2', data=df, fit_reg=False, col='列名3', col_wrap=3)
sns.relplot(x='列名1', y='列名2', data=df, hue='列名3', col='列名4', col_wrap=3)
复制代码
  • fit_reg参数展示拟合线
ax = sns.lmplot(x=df['列名1'], y=df['列名2'], fit_reg=True, hue='列名3')
复制代码

4.3.4 seaborn图表主题样式设置

import seaborn as sns # 导包
#使用subplots函数创建画布,并在其中添加子图
fig, ax = plt.subplots()
sns.set_style('darkgrid') # 黑色网格
sns.set_style('whitegrid') # 白色网格
sns.set_style('dark') # 黑色背景
sns.set_style('white') # 白色背景
ax.set_title('设置图标题并设置字体大小', size=10)
ax.set_xlabel('设置x轴名称并设置字体大小', size=10)
ax.set_ylabel('设置y轴名称并设置字体大小', size=10)
ax = sns.distplot(df['列名']) # 画图
复制代码

4.4 Pyecharts绘图

  • pyecharts是一个用于生成echarts(百度公司前段开源)图表的Python开源类库

4.4.1 柱状图代码模板示例

from pyecharts import options as opts
from pyecharts.charts import Bar
bar = (
    Bar() #创建柱状图
    .add_xaxis(city_job_top20.index.tolist()) #添加x轴数据,接收list列表类型的数据
    .add_yaxis('图例说明', df.values.tolist())#设定y轴图例,添加y轴数据,接收list列表类型的数据
    .set_global_opts( #设置全局参数
        title_opts=opts.TitleOpts(title='图表标题'), #设置标题
        datazoom_opts=opts.DataZoomOpts(),#添加缩放条
    )
)
# 在指定路径下生成指定名称的html文件
#bar.render('./bar.html')
# 在juypter notebook中显示
bar.render_notebook() 
复制代码

4.4.2 词云图代码模板示例

from pyecharts.charts import WordCloud
from pyecharts import options as opts
c = (
    WordCloud() #创建词云图对象
    .add(series_name='词云中每个词的提示标题', #添加标题
         data_pair=list(zip(df.index.tolist(), df.values.tolist())), 
         word_size_range=[6, 40])#指定文字大小,注意如果字体太大可能显示不全
    .set_global_opts(#设置全局参数 标题,字号
        title_opts=opts.TitleOpts(title='图表标题', 
                                  title_textstyle_opts=opts.TextStyleOpts(font_size=23))
    )
)
# 出图
c.render_notebook()
复制代码

4.4.3 气泡图代码模板示例

from pyecharts.charts import Scatter
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

c = (
    Scatter() #创建散点图对象
    .add_xaxis(salary_data.salary_down.astype(int))#添加x周数据(薪资)
    .add_yaxis(
        "数据分析岗位数量", #图例说明
        [list(z) for z in zip(salary_data.job_count, salary_data.city)],#Y轴数据:岗位数量、城市
        label_opts=opts.LabelOpts(#Js代码控制气泡显示提示文字
            formatter=JsCode(
                "function(params){return params.value[2] + '岗位数量' + params.value[1] + '平均薪资' + params.value[0]}" #气泡提示
            ) # js代码中的params参数为 ==> (salary_down, job_count, city); 顺序是x轴的值(薪资),和y轴的值(岗位数, 城市)
        ),
    )
    .set_global_opts(#全局变量
        title_opts=opts.TitleOpts(title="数据分析就业岗位数量与平均起薪"),#设置标题
        tooltip_opts=opts.TooltipOpts(#Js代码控制气泡弹窗提示文字
            formatter=JsCode(
                "function (params) {return params.value[2]+ '平均薪资:'+params.value[0]}"
            )
        ),
        visualmap_opts=opts.VisualMapOpts(#控制
            type_="size", max_=1500, min_=200, dimension=1 # 控制条维度
        ),
        xaxis_opts=opts.AxisOpts(min_=4000, name='平均起薪'),#设置X轴起始值,X轴名字
        yaxis_opts=opts.AxisOpts(min_=300, max_=1800, name='岗位数量'),#设置Y轴起始值,Y轴名字
    )
)

c.render_notebook()
复制代码

4.4.4 圆环图代码模板示例

from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

c = (
    Pie()
    .add(
        series_name="经验要求",
        data_pair=[list(z) for z in zip(
            job['exp'].value_counts().index.tolist(),# 准备数据
            job['exp'].value_counts().values.tolist()
        )],
        radius=["40%", "70%"],#圆环图,内外径的半径大小
        label_opts=opts.LabelOpts(is_show=False, position="center"),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="数据分析工作经验要求"),
        legend_opts=opts.LegendOpts(pos_left="right", orient="vertical")) #设置图例位置
    .set_series_opts(
        tooltip_opts=opts.TooltipOpts(#鼠标滑过之后弹出文字格式
            trigger="item", # 固定参数
            formatter="{a}:{b};岗位数量:{c}(占比{d}%)" # a: series_name ; b: 1-3年 ; c: 岗位数量 ; d: 岗位数百分比的值
        ),
    )
)

c.render_notebook()
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享