01. 引言
由于最近开始使用R-ggplot2绘制一些可视化作品,也慢慢发现ggplot2绘图的方便之处,但毕竟开始于Python绘图,我们也不能落下
。所以尽量实现两种语言绘制同一幅可视化作品。本期推文也不例外,涉及的内容为地图数据,下面我们直接开始。
02. Python-matplotlib 绘制
我们使用的数据如下(部分):
我们主要使用上述四个特征列进行可视化绘制。首先,我们还是对各个地区(region) 进行颜色设置,使用我们常用的字典形式,如下:
代码语言:javascript复制region_color = {
'Africa': '#EA7480',
'Oceania': '#1BB6AF',
'Asia': '#F8CD9C',
'South America': '#172869',
'North America': '#088BBE',
'Europe': '#F6A1A5'}
- 可视化绘制:
这里使用matplotlib 的形状(patches)绘制函数,具体为矩形(Rectangle) 。官网参数及主要解释如下:
Rectangle类:
代码语言:javascript复制class matplotlib.patches.Rectangle(
xy, width, height, angle=0.0, **kwargs)
参数:
xy: 2元组 矩形左下角xy坐标
width:矩形的宽度
height:矩形的高度
angle: float, 可选,矩形相对于x轴逆时针旋转角度,默认0
fill: bool, 可选,是否填充矩形。
绘制代码如下:
代码语言:javascript复制import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
plt.rcParams['font.family'] = ["Roboto Mono"]
#from matplotlib.collections import PatchCollection
fig,ax = plt.subplots(figsize=(8,6),dpi=250,facecolor='#66BFBF',edgecolor='#66BFBF')
ax.set_facecolor('#66BFBF')
for x,y,c in zip(map_data.x,map_data.y,map_data.region):
rect = Rectangle((x 1,y 1),width=.95,height=.95, color=region_color[c])
ax.add_patch(rect)
#添加文本
for x,y,t in zip(map_data.x,map_data.y,map_data["alpha.2"]):
ax.text(x 1.1,y 1.8,t,c="white",size=6.5,fontweight='bold')
#定制化设置
ax.set_xticks([])
ax.set_xlim(left=1,right=32)
ax.set_yticks([])
ax.set_ylim(top=24,bottom=0)
#转置y轴
ax.invert_yaxis()
for spine in ['top','bottom','left','right']:
ax.spines[spine].set_visible(None)
ax.tick_params(left=None,bottom=False)
#添加描述信息
ax.text(.9,.006,'nVisualization by DataCharm',transform = ax.transAxes,
ha='center', va='center',fontsize = 7,color='white',fontweight='bold')
plt.savefig(r'F:DataCharm商业艺术图表仿制map_student_matplotlib.png',width=8,height=6,
dpi=900,bbox_inches='tight',facecolor='#66BFBF')
结果如下:
03. R-ggplot2 绘制
数据为同样数据(格式符合ggplot2 绘制要求),这里主要使用 geom_tile()和geom_text() 函数。这里我们主要解释下 geom_tile() 函数。其主要用于绘制“方块”,和 geom_rect()、geom_raster() 作用相似,不同之处在于其使用图块的中心及其大小(x,y,width,height),这就和matplotlib的 Rectangle类 几乎一样的功能。具体绘图代码如下:
代码语言:javascript复制map_region <- data %>%
ggplot(aes(x = x, y = y, fill = region, color = region))
geom_tile()
#添加文字
geom_text(aes(x = x, y = y, label = alpha.2), color = "white", size = 2.3,
fontface = "bold", family = "Roboto_Mono")
#转置y轴
scale_y_reverse()
#自定义颜色 matplotlib 中颜色设置就是来源于此。
scale_fill_manual(values = lacroix_palette("Pamplemousse", n = 6, type = "discrete"), guide = F)
scale_color_manual(values = lacroix_palette("Pamplemousse", n = 6, type = "discrete"), guide = F)
coord_equal()
#定制化设置
theme(line = element_blank(),
panel.background = element_rect(fill = "#66BFBF"),
plot.background = element_rect(fill = "#66BFBF", color = "#66BFBF"),
panel.border = element_blank(),
#strip.background = element_rect(colour = "grey20"),
axis.text = element_blank(),
plot.margin = margin(0, 0, 0, 0))
labs(x = NULL, y = NULL,caption = "nVisualization by DataCharm")
map_region
可以看出,得益于ggplot2 强大的绘图功能,省去了matplotlib 循环绘制的麻烦,直接 映射 即可。可视化效果如下:
两张图是不是看起来机会一样,大家可以自行选择自己喜欢的语言进行绘制,我这里只是为大家提供绘图思路而已
。
04. 总结
这篇推文也算是同时使用Python-matplotlib 和R-ggplot2 绘制同一幅可视化作品。至于这副图的具体用处,大家可以放置在一些世界地图上,做为另类"图例"。能力有限,有出错的地方大家可以指出或者进群讨论。