另类地图的Python和R绘制

2021-02-22 15:17:52 浏览数 (1)

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 绘制同一幅可视化作品。至于这副图的具体用处,大家可以放置在一些世界地图上,做为另类"图例"。能力有限,有出错的地方大家可以指出或者进群讨论。

0 人点赞