利用散点图探索帕尔默企鹅数据

利用散点图探索帕尔默企鹅数据

代码语言:javascript代码运行次数:0运行复制
import matplotlib.pyplot as plt
import numpy as np

from adjustText import adjust_text
from faker import Faker
from palmerpenguins import load_penguins

数据探索

以下数据如果有需要的同学可关注公众号HsuHeinrich,回复【数据可视化】自动获取~

代码语言:javascript代码运行次数:0运行复制
# 数据展示
penguins = load_penguins()
penguins.head()
image-20240129170656049

image-20240129170656049

species:企鹅的种类,包括 Adelie、Chinstrap 和 Gentoo 三种。 island:企鹅所在岛屿的名字,包括 Biscoe、Dream 和 Torgersen 三个岛屿。 bill_length_mm:企鹅的喙长,单位毫米。 bill_depth_mm:企鹅的喙深,单位毫米。 flipper_length_mm:企鹅的鳍长,单位毫米。 body_mass_g:企鹅的体重,单位克。 sex:企鹅的性别,包括 Male 和 Female。

代码语言:javascript代码运行次数:0运行复制
# 数据清洗
penguins = penguins.dropna() # 删除na

绘制基础散点图

代码语言:javascript代码运行次数:0运行复制
# 设置基础信息:包括颜色、物种列表等信息

# 颜色
BG_WHITE = "#fbf9f4"
GREY_LIGHT = "#b4aea9"
GREY50 = "#7F7F7F"
GREY30 = "#4d4d4d"
BLUE_DARK = "#1B2838"
BLUE = "#2a475e"
COLORS = ["#386cb0", "#fdb462", "#7fc97f" ] # 为物种分配颜色

# 物种列表
SPECIES = sorted(penguins["species"].unique())

# 水平线
HLINES = [40, 50, 60]

# 刻度值列表
YTICKS = [40, 50, 60]
XTICKS = [160, 170, 180, 190, 200, 210, 220, 230, 240]

# 随机生成企鹅名字
faker = Faker()
faker.seed_instance(11) 
NAMES = [faker.first_name() for i in range(len(penguins))]

# 标记形状列表
MARKERS = ["o", "^", "s"]
代码语言:javascript代码运行次数:0运行复制
# 初始化画布
fig, ax = plt.subplots(figsize= (14, 10))

# 背景颜色
fig.patch.set_facecolor(BG_WHITE)
ax.set_facecolor(BG_WHITE)

# 水平线
for h in HLINES:
    ax.axhline(h, color=GREY50, ls=(0, (5, 5)), alpha=0.8, zorder=0)

# 分组散点图
for species, color, marker  in zip(SPECIES, COLORS, MARKERS):
    data = penguins[penguins["species"] == species]
    ax.scatter(
        "flipper_length_mm", "bill_length_mm", s=50, color=color, 
        marker=marker, alpha=0.8, data=data
    )
output_12_0

output_12_0

添加不重叠的标签

代码语言:javascript代码运行次数:0运行复制
# adjustText可以自动放置标签

# 这里仅添加以c开头的名字
TEXTS = []
for i in range(len(penguins)):
    if NAMES[i].startswith("C"):
        x = penguins["flipper_length_mm"].iloc[i]
        y = penguins["bill_length_mm"].iloc[i]
        text = NAMES[i]
        TEXTS.append(ax.text(x, y, text, color=GREY30, fontsize=14, fontname="Poppins"))
        
# 添加标签
adjust_text(
    TEXTS, 
    expand_points=(2, 2),
    arrowprops=dict(
        arrowstyle="->", 
        color=GREY50, 
        lw=2
    ),
    ax=fig.axes[0]
)
fig
output_14_0

output_14_0

为图表增加更丰富的信息

代码语言:javascript代码运行次数:0运行复制
# 添加标题与子标题
# 标题
fig.suptitle(
    "Palmer Penguins Data Visualization",
    x = 0.122,
    y = 0.975,
    ha="left",
    fontsize=32,
    fontname="Lobster Two",
    color=BLUE,
    weight="bold",    
)

# 子标题
ax.set_title(
    "Scatter plot of flipper length vs bill length",
    loc="left",
    ha="left",
    fontsize=24,
    fontname="Lobster Two",
    color=BLUE_DARK,
    weight="bold",
    pad=10
)

# 添加图例
legend = ax.legend(
    loc=(0.85, 0.025), # bottom-right
    labelspacing=1.5,  # add space between labels
    markerscale=1.5,   # increase marker size
    frameon=False      # don't put a frame
)

# 图例信息
for text, species in zip(legend.get_texts(), SPECIES):
    text.set_text(species)       
    text.set_fontname("Roboto")  
    text.set_fontsize(16)    
    
# 图例标题信息
legend.set_title("Species")
legend_title = legend.get_title()
legend_title.set_fontname("Roboto")
legend_title.set_fontweight("bold")
legend_title.set_fontsize(18)
legend_title.set_ha("left")

# 自定义边框布局
# 隐藏边框
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")

# 边框颜色
ax.spines["left"].set_color(GREY_LIGHT)
ax.spines["left"].set_linewidth(2)
ax.spines["bottom"].set_color(GREY_LIGHT)
ax.spines["bottom"].set_linewidth(2)

# 刻度
ax.tick_params(length=0)

ax.set_yticks(YTICKS)
ax.set_yticklabels(YTICKS, fontname="Lobster Two", size=15)
ax.set_ylabel("bill Length (mm)", fontname="Lobster Two", size=18, weight="bold")

ax.set_xticks(XTICKS)
ax.set_xticklabels(XTICKS, fontname="Lobster Two", size=15)
ax.set_xlabel("flip length (mm)", fontname="Lobster Two", size=18, weight="bold")

fig
output_16_0

output_16_0

参考:Scatterplot with labels and text repel in Matplotlib[1]

共勉~

参考资料

[1]

Scatterplot with labels and text repel in Matplotlib: /

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-28,如有侵权请联系 cloudcommunity@tencent 删除text基础数据legendset