Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用连接散点图探索全球的饮用水情况

利用连接散点图探索全球的饮用水情况

作者头像
HsuHeinrich
发布于 2025-07-01 06:20:03
发布于 2025-07-01 06:20:03
4000
代码可运行
举报
文章被收录于专栏:HsuHeinrichHsuHeinrich
运行总次数:0
代码可运行

利用连接散点图探索全球的饮用水情况

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

from scipy.stats import rankdata

数据探索

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入数据
data_raw = pd.read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-05-04/water.csv")

# 数据预处理
data = (
    data_raw
    .dropna(subset=["install_year", "country_name"]) # 剔除空数据
    .assign(
        install_decade = (data_raw["install_year"] // ) * , # 将年份转为年代,即每10年的年初
    )
    .query("1970 <= install_decade <= 2020") # 筛选19702020年的数据
)

# 计算新安装量
data["nb_install"] = data.groupby(["country_name", "install_decade"])["country_name"].transform("size") 

# 长宽数据转化-保留19702020的数据
data_pivoted = pd.pivot_table(
    data, index="country_name", values="nb_install", columns="install_decade"
).dropna().reset_index()

data = pd.melt(data_pivoted, id_vars = "country_name", value_name="nb_install", var_name="decade")

# 处理数据,生成rank(表示每decade新安装量的降序排名)
data["country_name"] = data["country_name"].str.upper()
data["rank"] = data.groupby("decade")["nb_install"].transform(lambda x: rankdata(-x))
data = data.sort_values(["country_name", "decade"])

data.head()
image-20240129173348659
image-20240129173348659

image-20240129173348659

country_name:名称 decade:年代 nb_install:安装量 rank:排名

绘制连接散点图-突出显示指定国家

  1. 绘制第一个国家,理解本图的组成部分
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COUNTRIES = data["country_name"].unique()
COUNTRY = COUNTRIES[]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 初始化布局
fig, ax = plt.subplots(figsize=(, ))

# 反转y轴
ax.invert_yaxis()

# 循环遍历国家
for country in COUNTRIES:
    d = data[data["country_name"] == country] 
    x = d["decade"].values
    y = d["rank"].values
    
    # 突出显示指定国家
    if country == COUNTRY:
        ax.plot(x, y, color="#0b53c1", lw=2.4, zorder=)
        ax.scatter(x, y, fc="w", ec="#0b53c1", s=, lw=2.4, zorder=)      
    # 其余国家不突出显示
    else:
        ax.plot(x, y, color="#BFBFBF", lw=1.5)
output_8_0
output_8_0

output_8_0

  1. 添加适当的注释信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add_label(x, y, fontsize, ax):
    '''
    x:decade取值;y:rank取值
    在对应的点附近添加年代和排名信息
    '''
    PAD = 0.4
    ax.annotate(
        f"#{int(y)} in\n{str(int(x))[:]}s", 
        xy=(x, y - PAD), 
        ha="center", 
        va="bottom",
        fontsize=fontsize,
        fontname="Lato",
        zorder=
    )
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 初始化布局
fig, ax = plt.subplots(figsize=(, ))
ax.invert_yaxis()

for country in COUNTRIES:
    d = data[data["country_name"] == country] 
    x = d["decade"].values
    y = d["rank"].values
    
    if country == COUNTRY:
        ax.plot(x, y, color="#0b53c1", lw=2.4, zorder=)
        ax.scatter(x, y, fc="w", ec="#0b53c1", s=, lw=2.4, zorder=)
        
        # 添加文本信息(首尾点上)
        add_label(x[], y[], , ax)
        add_label(x[-1], y[-1], ,ax)
    else:
        ax.plot(x, y, color="#BFBFBF", lw=1.5)

# 删除y刻度
ax.set_yticks([])

# x刻度
ax.set_xticks([, , , , , ])

# x刻度标签
ax.set_xticklabels(
    ["70s", "80s", "90s", "00s", "10s", "20s"], 
    fontsize=,
    fontfamily="Inconsolata"
)
# 删除底部刻度线
ax.tick_params(bottom=False)

# 删除边框
ax.set_frame_on(False)

# 添加标题
ax.set_title(COUNTRY, fontfamily="Inconsolata", fontsize=, fontweight=);
output_11_0
output_11_0

output_11_0

  1. 在以上的基础上,绘制多图(多个国家的排名)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def plot_country(country, data, annotate, ax):
    '''
    将上述单个国家的绘制过程写入函数,annotate为控制变量(是否添加文本注释)
    '''
    
    for country_inner in COUNTRIES:
        d = data[data["country_name"] == country_inner] 
        x = d["decade"].values
        y = d["rank"].values

        if country_inner == country:
            ax.plot(x, y, color="#0b53c1", lw=2.4, zorder=)
            ax.scatter(x, y, fc="w", ec="#0b53c1", s=, lw=2.4, zorder=)
            if annotate:
                add_label(x[], y[], , ax)
                add_label(x[-1], y[-1], , ax)
        else:
            ax.plot(x, y, color="#BFBFBF", lw=1.5)

    ax.set_yticks([])
    ax.set_xticks([, , , , , ])
    ax.set_xticklabels(
        ["70s", "80s", "90s", "00s", "10s", "20s"], 
        fontsize=,
        fontfamily="Inconsolata"
    )
    ax.tick_params(bottom=False)
    ax.set_frame_on(False)

    ax.set_title(country, fontfamily="Inconsolata", fontsize=, fontweight=)
    
    return ax
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 初始化布局
fig, axes = plt.subplots(, , sharex=True, sharey=True, figsize=(, 7.5))

for idx, (ax, country) in enumerate(zip(axes.ravel(), COUNTRIES)):
    # 仅第一个国家添加文本注释
    annotate = idx == 
    plot_country(country, data, annotate, ax)

# 反转y轴
ax.invert_yaxis()

# 调整布局
fig.subplots_adjust(wspace=0.1, left=0.025, right=0.975, bottom=0.11, top=0.82)

# 标题
fig.text(
    x=0.5, 
    y=0.92,
    s="RANKING SOME COUNTRIES BY THE NUMBER\nOF WATER SOURCES INSTALLATIONS BY DECADE",
    ha="center",
    va="center",
    ma="center",
    fontsize=,
    fontweight="bold",
    fontname="Inconsolata"
)

# 著作信息-数据来源
fig.text(
    x=0.975,
    y=0.05,
    s="Data from Water Point Data Exchange",
    ha="right",
    ma="right",
    fontsize=
)

# 著作信息-作者
fig.text(
    x=0.975,
    y=0.03,
    s="@issa_madjid",
    ha="right",
    ma="right",
    fontsize=,
    fontweight="bold", 
)

# 推特徽标
twitter_symbol = "\uf099"

fig.text(
    x=0.925,
    y=0.03,
    s=twitter_symbol,
    ha="right",
    ma="right",
    fontsize=,
    fontweight="bold",
    fontfamily="Font Awesome 5 Brands"
)

# 背景色
fig.set_facecolor("#f9fbfc")
output_14_0
output_14_0

output_14_0

参考:Multi panel highlighted lineplots with Matplotlib[1]

共勉~

参考资料

[1] 

Multi panel highlighted lineplots with Matplotlib: https://python-graph-gallery.com/web-highlighted-lineplot-with-faceting/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HsuHeinrich 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python-matplotlib 商业图表绘制03
本篇推文为python-matplotlib 商业图表绘制的第三篇文章,主要内容为圆润柱状图的绘制,这也是我之前一直想做的事情,在浏览Matplotlib官网时,发现了一个方法,就试着进行绘制,效果还不错。接下来,我们开始
DataCharm
2021/02/22
6290
Python-matplotlib 商业图表绘制03
Python-matplotlib 商业图表仿制第7弹
虽然小伙伴们喜欢空间绘图方面的居多(毕竟这方面的小伙伴居多),但商业图表的绘制也不能放下哦!本期就推出一篇商业图表的仿制教程。主要涉及内容如下:
DataCharm
2021/02/22
3610
Python-matplotlib 商业图表仿制第7弹
利用小提琴图探索帕尔默企鹅数据
众所周知,可视化好不好看,全凭注释是否精(花)准(哨)。接下来就是最考验技术的地方了!
HsuHeinrich
2025/04/23
840
利用小提琴图探索帕尔默企鹅数据
maplotlib 标准颜色、风格样式和水印
一、标准颜色列表 """ ======================== Visualizing named colors ======================== Simple plot
用户6021899
2019/08/14
9260
Python-matplotlib 商业图表绘制04
本期还是推出Python-matplotlib "小清新"商业图表的绘制推文,在发现ax.plot()绘图函数的多类别图表功能后,经过不断和点、文本等尝试搭配后,所能构建的图表也就多了起来,下面就直接上教程。
DataCharm
2021/02/22
9750
Python-matplotlib 商业图表绘制04
工具包 | 使用Python绘制Sci学术期刊配图
之前还在讨论Matplotlib没有很好的第三方主题库呢?这不,又被我发现了一个宝藏库,还专门用于一些学术期刊的图表发表,可谓是弥补了matplotlib 繁琐的自定义设置。好了,话不多说,今天这篇推文的主角就是Github 上拥有1.6k 星之多的科学论文图表绘制库「SciencePlots」。推文的主要内如下:
气象学家
2020/10/09
13.3K0
工具包 | 使用Python绘制Sci学术期刊配图
趋势(一)利用python绘制折线图
折线图用于在连续间隔或时间跨度上显示定量数值,最常用来显示趋势和关系(与其他折线组合起来)。折线图既能直观地显示数量随时间的变化趋势,也能展示两个变量的关系。
HsuHeinrich
2024/11/23
4450
趋势(一)利用python绘制折线图
使用 Python-Matplotlib 制作有趣的数据可视化分析,一起来看看吧
今天,我们使用 Netflix 电影和电视节目数据集,来进行数据可视化,当然这是一个有趣的实战过程哦!
周萝卜
2021/10/13
5040
Python-matplotlib 商业图表绘制02
Python-matplotlib商业图表绘制的第二篇教程也已经推出,本期的推文主要涉及到文本、annotate()、散点以及颜色搭配等内容的讲解,话不多说,直接上教程
DataCharm
2021/02/22
4130
Python-matplotlib 商业图表绘制02
Python-matplotlib 多类别学术散点图制作
本期推文回归学术图表的绘制教程,本次的推文也是在查看SCI论文时发现,图表简单明了且使用较多,接下来我们通过构建虚拟数据进行符合出版的多类别散点图绘制。
DataCharm
2021/02/22
8940
Python-matplotlib 多类别学术散点图制作
Python-matplotlib 散点图绘制
本期推文的主要内容是散点图的绘制教程,所使用的数据关于全球教育水平划分的师生比例,涉及到的包主要为matplotlib和seaborn,当然用于数据处理分析的pandas和 numpy也必不可少。
DataCharm
2021/02/22
1.6K0
Python-matplotlib 散点图绘制
利用散点图探索帕尔默企鹅数据
参考:Scatterplot with labels and text repel in Matplotlib[1]
HsuHeinrich
2025/04/29
860
利用散点图探索帕尔默企鹅数据
kaggle实战-基于机器学习的中风病人预测
基于随机森林、逻辑回归、SVM的中风病人预测 原数据地址:https://www.kaggle.com/datasets/fedesoriano/stroke-prediction-dataset?d
皮大大
2023/08/25
1.6K0
密度图及山脊图绘图基础
Seaborn 的 kdeplot() 函数是 Python 中绘制密度图的方式之一,Matplotlib 在现阶段则没有具体的绘制密度图的函数,一般是结合 Scipy 库中的 gaussian_kde() 函数结果进行绘制。
timerring
2023/10/13
7600
密度图及山脊图绘图基础
经济学人风格图表的Python-Seaborn和R-ggplot2绘制
最近着手准备使用R-ggpot2进行图表绘制,当然,Python可视化图表绘制也不能落下,所以,后面的推文我尽量会推出两种教程
DataCharm
2021/02/22
1K0
经济学人风格图表的Python-Seaborn和R-ggplot2绘制
科技感爆棚!这样酷炫的Python图表谁能不爱?
色彩搭配对图表的第一印象至关重要,合理的设置对图表的颜值提升有着很大的帮助,本期推文结合一个具体例子对图表颜色搭配进行讲解。
小F
2020/12/16
8090
科技感爆棚!这样酷炫的Python图表谁能不爱?
超酷炫,百行Python代码制作动态曲线图
主要思路是设计plot_frame绘图函数绘制逐桢图片,然后用matplotlib.animation构建动画,如果有需要,还可以导出成gif和mp4。
lyhue1991
2021/06/15
1K0
Figure解析
“PDFMV框架是问题-数据-特征-模型-价值五个英文字母的首字母组合而成,它是以问题为导向,数据为驱动,利用特征和模型从数据中学习到知识,以创造价值的系统化过程。”
陆勤_数据人网
2020/04/07
9520
Figure解析
Python-matplotlib 商业图表-第5弹
第一次使用 Markdown Nice 进行公众号编写(其实刚开始运营公众号时也有使用过,奈于代码编辑就放弃,不过,现在“真香”了 ),希望熟悉后定制自己属于自己的主题。本期还是继续前面的Python-matplotlib 商业图表绘制系列的第5篇教程推文,目的还是为了熟悉matplotlib的绘图语法。
DataCharm
2021/02/22
2630
Python-matplotlib 商业图表-第5弹
显示组成一个图的多个元素的名称的分布。
import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import AutoMinorLocator, MultipleLocator, FuncFormatter np.random.seed(19680801) X = np.linspace(0.5, 3.5, 100) Y1 = 3+np.cos(X) Y2 = 1+np.cos(1+X/0.75)/2 Y3 = np.random.uniform(Y
裴来凡
2022/05/28
9560
显示组成一个图的多个元素的名称的分布。
相关推荐
Python-matplotlib 商业图表绘制03
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验