【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