前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python-seaborn 经济学人经典图表仿制

Python-seaborn 经济学人经典图表仿制

作者头像
DataCharm
发布2021-02-22 12:07:26
5470
发布2021-02-22 12:07:26
举报

上篇原创推文使用了R-ggplot2 实现了经济学人经典的图表仿制实现R-ggplot2 经典经济学人图表仿制,所以这期呢,我们就使用Python-seaborn实现这个经典的经济学人图表再现。主要涉及的知识点如下:

  • Python-seaborn regplot回归线性拟合图绘制
  • matplotlib 绘图图例的定制化绘制
  • adjustText 库实现文本避重添加

Python-seaborn 绘制拟合线图

首先,我们预览下数据(部分):

其中Region_new 列则是根据相关要求更改的新列,作图也是以次数据为基础的。

使用seaborn 进行拟合线的绘制就可以避免自己重复造轮子,接下来我们直接绘制最基础(没经过任何修饰的),代码如下:

代码语言:javascript
复制
fig,ax = plt.subplots(figsize=(8,4.5),dpi=200,facecolor='white',edgecolor='white')
ax.set_facecolor("white")
fit_line = sns.regplot(data=test_data,x="CPI",y="HDI",logx=True,ax=ax)

ax.text(.85,-.07,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 8,color='black')

可视化效果如下:

这里需要主要的参数如下:

  1. logx :用于绘制对数拟合曲线,默认为False,即绘制线性拟合线。
  2. ci :即绘制拟合曲线的置信区间,可以是(0~100)的整数,也可以设置为False,即不绘制置信区间。
  3. {scatter,line}_kws : 字典类型,即可定制化设置点和线的绘图属性,包括颜色、大小、粗细等

目前只介绍这些(因为绘图需要),更多详细内容可以参照对应官网:seaborn.regplot

我们直接放上绘制的可视化代码,然后再进行单独解释,代码如下:

代码语言:javascript
复制
fig,ax = plt.subplots(figsize=(8,4.5),dpi=200,facecolor='white',edgecolor='white')
ax.set_facecolor("white")

color = [region_color[i] for i in test_data['Region_new']]

fit_line = sns.regplot(data=test_data,x="CPI",y="HDI",logx=True,ci=False,
                       line_kws={"color":"red",
                                 "label":r"$R^2$=56%",
                                 "lw":1.5},
                       scatter_kws={"s":50,"fc":"white",
                                    "ec":color,
                                    "lw":1.5,
                                    "alpha":1},
                       ax=ax)

texts = []
for i, j ,t  in zip(data_text["CPI"],data_text["HDI"],data_text["Country"]):
    texts.append(ax.annotate(t,xy=(i, j),xytext=(i-.8,j),
                              arrowprops=dict(arrowstyle="-", color="black",lw=.5),
                              color='black',size=9))
adjust_text(texts,only_move={'text': 'xy','objects':'x','point':'y'})
#adjust_text(texts,only_move={'text': 'xy'})

ax.set_xlabel("Corruption Perceptions Index, 2011 (10=least corrupt)",fontstyle="italic",
             fontsize=8)

ax.set_ylabel("Human Development Index, 2011 (1=best)",fontstyle="italic",fontsize=8)

ax.set_xlim((.5, 10.2))
ax.set_ylim((.2, 1))
ax.set_xticks(np.arange(1, 10.3, step=1))
ax.set_yticks(np.arange(0.2, 1.05, step=0.1))

#网格设置
ax.grid(which='major',axis='y',ls='-',c='gray',)
ax.set_axisbelow(True)
#轴脊设置
for spine in ['top','left','right']:
    ax.spines[spine].set_visible(None) #隐去轴脊
ax.spines['bottom'].set_color('k') #设置bottom颜色
#刻度设置,只显示bottom的刻度,且方向向外,长、宽也进行设置
ax.tick_params(bottom=True,direction='in',labelsize=12,width=1,length=3,
               left=False)
    
#添加图例
ax.scatter([], [], ec='#01344A', fc="white",label='OECD', lw=1.5)
ax.scatter([], [], ec='#228DBD', fc="white",label='Americas', lw=1.5)
ax.scatter([], [], ec='#6DBBD8', fc="white",label='Asia & \nOceania', lw=1.5)
ax.scatter([], [], ec='#1B6E64', fc="white",label='Central & \nEastern Europe', lw=1.5)
ax.scatter([], [], ec='#D24131', fc="white",label='Middle East & \nnorth Africa', lw=1.5)
ax.scatter([], [], ec='#621107', fc="white",label='Sub-Saharan \nAfrica', lw=1.5)
ax.legend(loc="upper center",frameon=False,ncol=7,fontsize=6.5,bbox_to_anchor=(0.5, 1.1))


ax.text(.5,1.19,"Corruption and human development",transform = ax.transAxes,ha='center', 
        va='center',fontweight="bold",fontsize=16)

ax.text(.5,1.12, "Base Charts:Scatter Exercise in Python",
        transform = ax.transAxes,ha='center', va='center',fontsize = 12,color='black')
ax.text(.9,.05,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 8,color='black')

「知识点」

  • 颜色字典构建,方便赋值散点颜色
代码语言:javascript
复制
color = ('#01344A','#228DBD','#6DBBD8','#1B6E64','#D24131','#621107')
region =("OECD","Americas","Asia & \nOceania","Central & \nEastern Europe",
         "Middle East & \nnorth Africa", "Sub-Saharan \nAfrica")
region_color = dict(zip(region,color))

color = [region_color[i] for i in test_data['Region_new']]

#在regplot()调用如下
scatter_kws={"s":50,"fc":"white",
              "ec":color,
              "lw":1.5,
              "alpha":1}
  • adjust_text()方法添加ax.annotate属性
代码语言:javascript
复制
texts = []
for i, j ,t  in zip(data_text["CPI"],data_text["HDI"],data_text["Country"]):
    texts.append(ax.annotate(t,xy=(i, j),xytext=(i-.8,j),
                              arrowprops=dict(arrowstyle="-", color="black",lw=.5),
                              color='black',size=9))
adjust_text(texts,only_move={'text': 'xy','objects':'x','point':'y'})
  • matplotlib 定制化图例设置
代码语言:javascript
复制
#添加图例
ax.scatter([], [], ec='#01344A', fc="white",label='OECD', lw=1.5)
ax.scatter([], [], ec='#228DBD', fc="white",label='Americas', lw=1.5)
ax.scatter([], [], ec='#6DBBD8', fc="white",label='Asia & \nOceania', lw=1.5)
ax.scatter([], [], ec='#1B6E64', fc="white",label='Central & \nEastern Europe', lw=1.5)
ax.scatter([], [], ec='#D24131', fc="white",label='Middle East & \nnorth Africa', lw=1.5)
ax.scatter([], [], ec='#621107', fc="white",label='Sub-Saharan \nAfrica', lw=1.5)
ax.legend(loc="upper center",frameon=False,ncol=7,fontsize=6.5,bbox_to_anchor=(0.5, 1.1))

最终可视化效果如下:

总结

这期我们推出了Python-seaborn的经典可视化作品的再现推文,虽最终的结果还存在问题(当然,你可以定制化具体位置解决),但其主要目的还是让大家学习绘图技巧,特别是涉及拟合曲线图的绘制(有轮子就直接用啊,别想着自己再造啦)。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python-seaborn 绘制拟合线图
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档