首页 > 编程笔记 > Python笔记 阅读:7

Python绘制包点图(附带实例)

包点图是一种用来展示数据分布的图表类型,它使用点来表示数据点的位置和数量。

在包点图中,每个数据点都用一个小圆点或小方块来表示,通常是在一条水平或垂直的轴上进行排列。数据点的位置表示其数值,而数据点的数量则可以通过点的大小、颜色或形状来表示。

包点图通常用于展示分类数据的分布情况,特别是当数据量较少或数据点之间存在重叠时。通过将数据点以点的形式直接绘制在轴上,包点图可以清晰地展示数据的集中程度和分布形态,同时也能够直观地比较不同类别之间的差异。

包点图的优点包括简洁直观、易于理解和阅读,同时也可以有效地展示异常值和集中趋势。然而,当数据点数量较大或重叠较多时,包点图可能会变得混乱不清,此时可以考虑使用其他类型的图表来更好地展示数据。

【实例 1】利用包点图显示不同制造商的平均城市里程。输入如下 Python 代码:
import pandas as pd
import matplotlib.pyplot as plt

df_raw=pd.read_csv("D:/DingJB/PyData/mpg_ggplot2.csv")  # 读取数据

# 按制造商分组,并计算每个制造商的平均城市里程
df=df_raw[['cty','manufacturer']].groupby('manufacturer').apply(
    lambda x:x.mean())

# 按城市里程排序数据
df.sort_values('cty',inplace=True)
df.reset_index(inplace=True)

fig,ax=plt.subplots(figsize=(8,5),dpi=80)  # 绘图

# 使用hlines()绘制水平线条,代表每个制造商
ax.hlines(y=df.index,xmin=11,xmax=26,color='gray',alpha=0.7,
linewidth=1,linestyles='dashdot')

# 使用scatter()绘制点,点的位置表示城市里程
ax.scatter(y=df.index,x=df.cty,s=75,color='firebrick',alpha=0.7)

# 设置标题、标签、刻度和X轴范围
ax.set_title('Dot Plot for Highway Mileage', fontdict={'size':16})  # 设置标题
ax.set_xlabel('Miles Per Gallon')  # 设置横轴标签
ax.set_yticks(df.index)  # 设置纵轴刻度
ax.set_yticklabels(df.manufacturer.str.title(),fontdict={
    'horizontalalignment':'right'})  # 设置纵轴标签
ax.set_xlim(10,27)  # 设置X轴范围

plt.show()
上述代码首先从 CSV 文件中读取原始数据,并按照制造商分组,计算每个制造商的平均城市里程,并以水平线条的形式展示在图中,每个制造商对应一条水平线条。

接着,使用点图展示了每个制造商的平均城市里程,其中点的大小和颜色表示了城市里程的数值,同时添加了相应的标题、标签和刻度。

输出的结果如下图所示:


图 1 包点图1

【实例 2】创建一个包点图,其中点的大小和颜色都是基于 mpg_z 列的值进行设置的,并在每个点上添加 mpg_z 的值作为标签。输入如下代码:
# 导入必要的库
import pandas as pd
import matplotlib.pyplot as plt

df=pd.read_csv("D:/DingJB/PyData/mtcars1.csv")  # 读取数据

# 提取'mpg'列作为x变量,并计算其标准化值
x=df.loc[:,['mpg']]
df['mpg_z']=(x-x.mean())/x.std()

# 根据'mpg_z'列的值确定颜色
df['colors']=['red' if x<0 else 'darkgreen' for x in df['mpg_z']]

df.sort_values('mpg_z',inplace=True)  # 根据'mpg_z'列的值对数据进行排序
df.reset_index(inplace=True)  # 重置索引

# 绘制图形
plt.figure(figsize=(14,12),dpi=80)
plt.scatter(df.mpg_z,df.index,s=450,alpha=0.6,color=df.colors)

# 在每个点上添加'mpg_z'的值作为标签
for x,y,tex in zip(df.mpg_z,df.index,df.mpg_z):
    t=plt.text(x,y,round(tex,1),
        horizontalalignment='center',
        verticalalignment='center',
        fontdict={'color':'white'})

# 轻化边框
plt.gca().spines["top"].set_alpha(0.3)
plt.gca().spines["bottom"].set_alpha(0.3)
plt.gca()["right"].set_alpha(0.3)
plt.gca().spines["left"].set_alpha(0.3)

plt.yticks(df.index,df.cars)  # 设置Y轴刻度标签
plt.title('Diverging Dotplot of Car Mileage',
    fontdict={'size':20})
plt.xlabel('$Mileage$')  # 设置X轴标签
plt.grid(linestyle='--',alpha=0.5)  # 添加网格线
plt.xlim(-2.5,2.5)  # 设置X轴范围
plt.show()
上述代码利用包点图展示了汽车里程数据的分布情况,通过计算并标准化里程值,以点的大小和颜色形式直观呈现不同汽车的里程表现,同时添加了标签显示标准化值,使得数据分布更易于理解。

输出的结果如下图所示:


图 2 包点图2

相关文章