复现Angewandte Chemie期刊图,换数据可用!
看到《德国应用化学》(Angewandte Chemie)期刊上一张图,使用Python复现一下吧!
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.
读入数据
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)
这张图是可交互的,点击鼠标可查看每种元素的详细数据,
https://docs.bokeh.org/en/latest/docs/examples/topics/categorical/periodic.html
加个外框、个性化title、配色,
严格避免红绿相邻(色盲友好配色),
红色作为强调色,风格严谨,
高饱和度对比,视觉冲击力强,
深色系(深蓝、深绿)为主,避免花哨,
-推荐阅读-
matplotlib教程:20w字+数百张图形+1W行代码+详细代码注释
seaborn教程:12.3万字+500多张图形+8000行代码
一些有用的学习资源:
复现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)