Python带你看不一样的《青春有你2》小姐姐之身高体重城市可视化分析

2022-06-27 14:06:08 浏览数 (1)

本篇我们基于上一篇文章爬取下来的数据进行分析,我们绘制学员城市柱状图,体重分布饼状图,身高分布饼状图。

我们使用到的模块:

matplotlib模块

1. Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形,中文网:https://www.matplotlib.org.cn/

2. 绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等

pandas模块

1. Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。中文网址:https://www.pypandas.cn/

2. Pandas有两个利器,DataFrame和Series

3. DataFrame是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

4. Series是一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。

下面我们就来实现数据可视化

1

绘制参赛选手城市柱状图

绘制柱状图我们使用matplotlib.pyplot的bar去绘制,用法如下:

matplotlib.pyplot.bar(left, height, alpha=1, width=0.8, color=,

edgecolor=, label=, lw=3)

left

x轴的位置序列,一般采用arange函数产生一个序

height

y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据

alpha

透明度

width

为柱形图的宽度,一般这是为0.8即可

color

柱形图填充的颜色

edgecolor

图形边缘颜色

label

解释每个图像代表的含义

lw

边缘or线的宽度

绘制参赛选手城市分布柱状图代码:

代码语言:javascript复制
import matplotlib.pyplot as plt
import pandas as pd
代码语言:javascript复制
def draw_bar_graph():
    # 使用pandas处理数据,读取json数据.
    df = pd.read_json('Day2Data/20200526.json', encoding="utf-8")
    # print(df)

    # 取出城市分布列
    grouped = df['name'].groupby(df['zone'])
    # 计算学员分布每个城市人数
    s = grouped.count()

    # s.index为城市名字,即x坐标轴
    zone_list = s.index
    # s.values为这个城市学员人数,即y坐标轴
    count_list = s.values

    # 设置显示中文
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    plt.figure(figsize=(20, 15))

    # 绘制柱状图
    plt.bar(range(len(count_list)), count_list, color='r', tick_label=zone_list, facecolor='#9999ff', edgecolor='white')

    # 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小
    plt.xticks(rotation=45, fontsize=20)
    plt.yticks(fontsize=20)

    plt.legend()
    plt.title('''《青春有你2》参赛选手''', fontsize=24)
    plt.savefig('Day3Data/bar_result.jpg')
    plt.show()

2

绘制参赛选手体重分布饼状图

绘制饼状图我们使用matplotlib.pyplot的pie去绘制,使用方法如下:

代码语言:javascript复制
matplotlib.pyplot.pie(x, explode=None, labels=None,              colors=None,
代码语言:javascript复制
              autopct=None, pctdistance=0.6, shadow=True,
代码语言:javascript复制
              labeldistance=1.1, startangle=None, radius=None,
              counterclock=True, wedgeprops=None, textprops=None,
              center = (0, 0), frame = False )
x绘图数据 (每一块)的比例,如果sum(x) > 1会使用sum(x)归一化explode饼图某些部分的突出显示,即呈现爆炸式labels(每一块)饼图外侧显示的说明文字startangle起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起shadow是否阴影labeldistancelabel绘制位置,相对于半径的比例, 如<1则绘制在饼图内侧autopct控制饼图内百分比设置,可以使用format字符串或者format function'%1.1f'指小数点前后位数(没有用空格补齐)pctdistance类似于labeldistance,指定autopct的位置刻度radius控制饼图半径textprops设置饼图中文本的属性,如字体大小、颜色等;center指定饼图的中心点位置,默认为原点frame是否要显示饼图背后的图框,如果为True的话,需要同时控制图框的x轴、y轴的范围和饼图的中心位置

绘制参赛选手体重分布饼状图:

代码语言:javascript复制
def draw_weight_pie():
    df = pd.read_json('Day2Data/20200526.json', encoding="utf-8")
    # print(df)
    df['weight'] = df['weight'].apply(lambda x: x.replace('kg', '')).astype('float')
    # df.info()

    # 设置切分区域
    listBins = [0, 45, 50, 55, 100]

    # 设置切分后对应标签
    listLabels = ['<=45kg', '46~50kg', '51~55kg', '>55kg']

    area = pd.cut(df['weight'], bins=listBins, right=True, labels=listLabels, retbins=False, precision=3, include_lowest=False)
    # print(area)
    s = (pd.value_counts(area))

    area_list = s.index
    # print(area_list)
    count_list = s.values
    # print(count_list)

    # 设置显示中文
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    # 0.1表示将B那一块凸显出来
    explode = (0.1, 0.1, 0, 0)
    plt.figure(figsize=(5, 5))

    # 控制x轴和y轴的范围
    plt.xlim(0, 4)
    plt.ylim(0, 4)

    # 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆
    plt.axes(aspect='equal')

    plt.pie(
            count_list, labels=area_list, colors=None, autopct='%.0f%%',
            explode=explode, pctdistance=0.6, shadow=True, labeldistance=1.1, startangle=30, radius=1,
            counterclock=True, wedgeprops=None,
            textprops={'fontsize': 15, 'color': 'k'}, center=(0, 0), frame=False
            )

    plt.title('''《青春有你2》参赛选手体重比例''', fontsize=14)
    plt.savefig('Day3Data/pie_result02.jpg')
    plt.show()

3

绘制参赛选手身高分布饼状图

我们根据学员身高,来绘制身高分布饼状图,和体重分布饼状图类似。

代码语言:javascript复制
def draw_height_pie():
    df = pd.read_json('Day3Data/20200525.json', encoding="utf-8")
    # print(df)
    df['height'] = df['height'].apply(lambda x: x.replace('cm', '')).astype('float')
    # df.info()

    # 设置切分区域
    listBins = [0, 150, 160, 165, 170, 190]

    # 设置切分后对应标签
    listLabels = ['<=150cm', '150~160cm', '160~165cm', '165~170cm', '>170cm']

    area = pd.cut(df['height'], bins=listBins, right=True, labels=listLabels, retbins=False, precision=3, include_lowest=False)
    # print(area)
    s = (pd.value_counts(area))

    area_list = s.index
    # print(area_list)
    count_list = s.values
    # print(count_list)
    # 设置显示中文
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    # 0.1表示将B那一块凸显出来
    explode = (0.1, 0, 0.1, 0, 0)
    plt.figure(figsize=(5, 5))

    # 控制x轴和y轴的范围
    plt.xlim(0, 4)
    plt.ylim(0, 4)

    # 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆
    plt.axes(aspect='equal')

    plt.pie(
            count_list, labels=area_list, colors=None, autopct='%.0f%%',
            explode=explode, pctdistance=0.6, shadow=True, labeldistance=1.1, startangle=30, radius=1,
            counterclock=True, wedgeprops=None,
            textprops={'fontsize': 15, 'color': 'k'}, center=(0, 0), frame=False
            )

    plt.title('''《青春有你2》参赛选手身高比例''', fontsize=14)
    plt.savefig('Day3Data/height_result.jpg')
    plt.show()

4

运行主函数

代码语言:javascript复制
if __name__ == "__main__":
    draw_bar_graph()
    draw_weight_pie()
    draw_height_pie()

5

运行结果

我们发现小姐姐们大部分都没超过100斤,身高大部分都在160以上,这是不是小姐姐美不美的第一个标准呢,哈哈。

下一篇我们接着去爬取《青春有你2》的评论内容,然后对评论内容做一下数据分析,绘制词云,看一下吃瓜群众都说些什么。

0 人点赞