pythonic生物人

复现Angewandte Chemie期刊图,换数据可用!

看到《德国应用化学》(Angewandte Chemie)期刊上一张图,使用Python复现一下吧!

doi/10.1002/anie.202524612原图
doi/10.1002/anie.202524612原图

C图是一张元素周期表,原文作用(c) Experimental Faraday efficiency of C2+ products on Cu-based SAAs (expressed as the average of different reports) in the form of periodic table with foreign elements. Red: high selectivity zone; blue: lowselectivity zone; green: unreported or nonmetallic elements.


读入数据

Image

python实现

使用python bokeh中的periodic_table方法。

from bokeh.plotting import figure, show
from bokeh.sampledata.periodic_table import elements
from bokeh.transform import dodge, factor_cmap

# 定义周期表的周期(行)标签
periods = ["I", "II", "III", "IV", "V", "VI", "VII"]
# 定义周期表的族(列)标签,1-18族
groups = [str(x) for x in range(1, 19)]

# 复制元素数据
df = elements.copy()
# 将原子质量转换为字符串类型
df["atomic mass"] = df["atomic mass"].astype(str)
# 将族转换为字符串类型
df["group"] = df["group"].astype(str)
# 将数字周期转换为罗马数字表示
df["period"] = [periods[x-1] for x in df.period]
# 清理数据:移除未定义族的元素
df = df[df.group != "-"]
# 移除特定元素(Lr和Lu),通常不显示在主要周期表中
df = df[df.symbol != "Lr"]
df = df[df.symbol != "Lu"]

# 定义不同元素类别的颜色映射
cmap = {
"alkali metal"         : "#a6cee3",  # 碱金属 - 浅蓝色
"alkaline earth metal" : "#1f78b4",  # 碱土金属 - 深蓝色
"metal"                : "#d93b43",  # 金属 - 红色
"halogen"              : "#999d9a",  # 卤素 - 灰色
"metalloid"            : "#e08d49",  # 类金属 - 橙色
"noble gas"            : "#eaeaea",  # 惰性气体 - 浅灰色
"nonmetal"             : "#f1d4Af",  # 非金属 - 米黄色
"transition metal"     : "#599d7A",  # 过渡金属 - 绿色
}

# 定义鼠标悬停时显示的工具提示信息
TOOLTIPS = [
    ("Name", "@name"),                      # 元素名称
    ("Atomic number", "@{atomic number}"),  # 原子序数
    ("Atomic mass", "@{atomic mass}"),      # 原子质量
    ("Type", "@metal"),                     # 元素类型
    ("CPK color", "$color[hex, swatch]:CPK"),  # CPK颜色(化学中常用的原子颜色编码)
    ("Electronic configuration", "@{electronic configuration}"),  # 电子排布
]

# 创建图形对象
p = figure(
    title="Periodic Table (omitting LA and AC Series)",  # 标题:周期表(省略镧系和锕系)
    width=1000, height=450,  # 图形尺寸
    x_range=groups,  # X轴范围:1-18族
    y_range=list(reversed(periods)),  # Y轴范围:I-VII周期(反转使I在最上面)
    tools="hover",  # 启用悬停工具
    toolbar_location=None,  # 隐藏工具栏
    tooltips=TOOLTIPS  # 设置工具提示
)

# 绘制周期表的主体矩形
# 每个矩形代表一个元素,位置由族和周期确定
r = p.rect("group", "period", 0.95, 0.95,  # 矩形宽度和高度为0.95
           source=df,  # 数据源
           fill_alpha=0.6,  # 填充透明度
           legend_field="metal",  # 根据元素类型创建图例
# 使用factor_cmap根据元素类型分配颜色
           color=factor_cmap('metal', palette=list(cmap.values()), factors=list(cmap.keys()))
)

# 定义文本属性字典,用于后续的所有文本标注
text_props = dict(source=df, text_align="left", text_baseline="middle")

# 计算元素符号的x坐标位置(向左偏移0.4个单位)
x = dodge("group", -0.4, range=p.x_range)

# 添加元素符号标注(居中显示)
p.text(x=x, y="period", text="symbol", 
       text_font_style="bold",  # 粗体显示
       **text_props)

# 添加原子序数标注(在元素符号上方)
p.text(x=x, y=dodge("period", 0.3, range=p.y_range),  # 向上偏移0.3个单位
       text="atomic number", text_font_size="11px", **text_props)

# 添加元素名称标注(在元素符号下方)
p.text(x=x, y=dodge("period", -0.35, range=p.y_range),  # 向下偏移0.35个单位
       text="name", text_font_size="7px", **text_props)

# 添加原子质量标注(在元素名称下方)
p.text(x=x, y=dodge("period", -0.2, range=p.y_range),  # 向下偏移0.2个单位
       text="atomic mass", text_font_size="7px", **text_props)

# 在周期表底部添加镧系和锕系元素的占位符标注
p.text(x=["3", "3"], y=["VI", "VII"],  # 位置:第3族,第VI和VII周期
       text=["LA", "AC"],  # 标注文本
       text_align="center", text_baseline="middle")

# 图形样式设置
p.outline_line_color = None# 移除外边框
p.grid.grid_line_color = None# 移除网格线
p.axis.axis_line_color = None# 移除坐标轴线
p.axis.major_tick_line_color = None# 移除主刻度线
p.axis.major_label_standoff = 0# 坐标轴标签与轴线的距离设为0
p.legend.orientation = "horizontal"# 水平方向图例
p.legend.location = "top_center"# 图例位置在顶部居中
p.hover.renderers = [r]  # 只对矩形元素启用悬停效果

# 显示图形
show(p)
Image

这张图是可交互的,点击鼠标可查看每种元素的详细数据,

Image

https://docs.bokeh.org/en/latest/docs/examples/topics/categorical/periodic.html

加个外框、个性化title、配色,

Image

严格避免红绿相邻(色盲友好配色),

Image

红色作为强调色,风格严谨,

Image

高饱和度对比,视觉冲击力强,

Image

深色系(深蓝、深绿)为主,避免花哨,

Image

-推荐阅读-

matplotlib教程:20w字+数百张图形+1W行代码+详细代码注释

图片

seaborn教程:12.3万字+500多张图形+8000行代码

图片

R可视化教程:28个章节+11w字+数百张图

图片
图片

一些有用的学习资源:

👉2026可视化工具TOP3

👉学习R可视化

👉Python matplotlib

👉嫌Matplotlib繁琐?试试Seaborn


复现Nature子刊上3张图,换数据即可用!
复现Nature“水”子刊上配图,换数据即可用!
喜提“Acceptance”,多亏这两张图,能顶60张图的工作量!
复现Nature正刊上3张图,换数据即可用!
复现IF50.0期刊上6张图,换数据即可用!
复现中科院IF 25.9期刊上3张图,换数据即可用!
复现Nature子刊中的2张图,换个数据即可用!
复现IF 48.5的期刊图,这个图帮你省下50%版面费!
喜提“Major Revision”,太多图,被质疑在堆工作量......
审稿人:凭这个3D Heatmap,必须给minor revision
复现Nature子刊上3张图,换数据即可用!
复现Nature“水”子刊上配图,换数据即可用!
喜提“Acceptance”,多亏这两张图,能顶60张图的工作量!
复现Nature正刊上3张图,换数据即可用!
复现IF50.0期刊上6张图,换数据即可用!

如何加入学习?

(备注:299)

图片