【Python】dataframe画图/可视化

在用dataframe计算出统计结果后,如果需要用画图的形式进行数据展示,该如何画以下类型的图片:柱状图、折线图、散点图、直方图、箱型图等,以及如何在一张图里画多张图的画法

1. 柱状图

1.1 最基础的绘图方法

import matplotlib.pyplot as plt

# 创建一个示例 DataFrame
data = {'A': [10, 20, 30], 'B': [15, 25, 35], 'C': [20, 30, 40]}
df = pd.DataFrame(data)

# 绘制柱状图
df[['A','C']].plot(kind='bar')
plt.show()

 结果:

1.2 规定分类的类型

假如数据表为班级和班级平均成绩,给每个班级的平均成绩画柱状图的话,可以使用:

import matplotlib.pyplot as plt

data = {'班级': ['一班','二班','三班','四班','五班'], '成绩': [85, 90, 75,92,88]}
df = pd.DataFrame(data)

# 绘制柱状图
fig, ax = plt.subplots(figsize=(8, 6))  # 修改图片大小,这里是宽 8 高 6

plt.bar(df['班级'], df['成绩'], color='green')

# 添加数字标签
for i, v in enumerate(df['成绩']):
    ax.text(i, v+0.1, round(v,1), ha='center')  # 在柱子上方添加数字标签

# 竖着显示班级名字等
ax.set_xticklabels(df['班级'], rotation='vertical', fontsize=12)    
    
plt.xlabel('班级', fontsize=13)
plt.ylabel('成绩', fontsize=13)
plt.title('各班级平均成绩', fontsize=13)
plt.show()

结果:

1.3 如何在一张图里画多个图

假如有一个数据表,A列是“是否及格”,B列是“A班人员是否及格的占比”,C列是“B班人员是否及格的占比”,需要在一张图里画两个柱状图,一左一右放在一起进行比较:

import pandas as pd
import matplotlib.pyplot as plt

# 设定图形的位置
plt.figure(figsize=(10, 6))
ax1 = plt.subplot(121)  # 1 行 2 列,第一个位置
ax2 = plt.subplot(122)  # 1 行 2 列,第二个位置

# 绘制第一组柱状图
bars1 = ax1.bar(df['是否及格'], df['A班_人员占比'], label='Group1',color='green')
for i, v in enumerate(df['A班_人员占比']):
    ax1.text(i, v+0.2, round(v,1), ha='center')  # 在柱子上方添加数字标签

ax1.set_ylim(0, 90)
ax1.set_title('A班',fontsize=13)
#ax1.set_xlabel('Index')
ax1.set_ylabel('百分比',fontsize=13)


# 绘制第二组柱状图
bars2 = ax2.bar(df['是否及格'], df['B班_人员占比'], label='Group2')
for i, v in enumerate(df['B班_人员占比']):
    ax2.text(i, v+0.2, round(v,1), ha='center')  # 在柱子上方添加数字标签

ax2.set_ylim(0, 90)
ax2.set_title('B班',fontsize=13)
#ax2.set_xlabel('Index')
ax2.set_ylabel('百分比',fontsize=13)

# 调整布局,使图形更美观
plt.suptitle('两个班级学生是否及格的占比情况',fontsize=15)  # 这里添加了总的标题
plt.tight_layout()

# 显示图形
plt.show()

结果:

2. 直方图

如果想看一下数据的整体分布是什么样子的,是左偏还是右偏,可以画一个直方图。

比如想要调研一下一个群体里每个人距离上次出去玩的天数的分布:

import pandas as pd
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 6))

# 绘制列 'A' 的直方图
plt.hist(df['距离上次出去玩的天数'],bins=50, edgecolor='black', alpha=0.7)

plt.show()

结果为:

3. 折线图

假如要在一张图里画多条折线图,数据表的样式类似于:A列是3个年份,B到D列是每个班级的人数;给每个班级都画一条人数变化折线图

import pandas as pd
import matplotlib.pyplot as plt

# 提取班级列
classes = df.columns[1:]

# 为每个班级绘制折线图
for class_name in classes:
    plt.plot(df['year'], df[class_name], label=class_name)

plt.xlabel('年份')
plt.ylabel('人数')
plt.title('各班级人数折线图')
plt.legend()
plt.show()

结果:

4. 箱型图

如果有好多组数据,想要看一下每一组数据的分布,可以用箱型图:

# 用于数值计算的库
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats
# 用于绘图的库
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
# 用于估计统计模型的库
import statsmodels.formula.api as smf
import statsmodels.api as sm
# 设置浮点数打印精度
%precision 3
# 在Jupyter Notebook 里显示图形
%matplotlib inline


# 以下两句防止中文显示为窗格
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"] = False


fig,axes=plt.subplots(1,1,sharey=True)
sns.boxplot(x="首次得分",y="最终得分",palette="Set3",data=df_分数,order=[1,2,2.5,3,3.5,5,'OL'])

plt.xlabel('首次得分')
plt.ylabel('最终得分')

结果:

作者:风儿啷个啷个吹w

物联沃分享整理
物联沃-IOTWORD物联网 » 【Python】dataframe画图/可视化

发表回复