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

DataCharm 2021-02-22 13:02:22
Python 经济学 seaborn 经济 python-seaborn


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

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

Python-seaborn 绘制拟合线图

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

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

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

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

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

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')

「知识点」

  • 颜色字典构建,方便赋值散点颜色
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属性
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 定制化图例设置
#添加图例
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的经典可视化作品的再现推文,虽最终的结果还存在问题(当然,你可以定制化具体位置解决),但其主要目的还是让大家学习绘图技巧,特别是涉及拟合曲线图的绘制(有轮子就直接用啊,别想着自己再造啦)。

本文分享自微信公众号 - DataCharm(shujumeili) ,作者:宁海涛

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间: 2020-11-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[DataCharm]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1790271

  1. Python 3 entry, see this is enough
  2. 华为大佬打造的400集Python视频学起来,学完万物皆可爬
  3. 400 episodes of Python video created by Huawei boss
  4. django之csrf_exempt解决跨域请求的问题
  5. CSRF of Django_ Exempt solves the problem of cross domain requests
  6. 1.7 万 Star!一个简单实用的 Python 进度条库
  7. 17000 stars! A simple and practical Python progress bar library
  8. Python爬虫:设置Cookie解决网站拦截并爬取蚂蚁短租
  9. Python crawler: setting cookie to solve website interception and crawling ant short rent
  10. Python-Net编程
  11. Python net programming
  12. 学习Python数学英语基础重要吗?Python教程!
  13. Is it important to learn the basics of math and English in Python!
  14. Python数据分析常用库有哪些?Python学习!
  15. What are the common libraries for Python data analysis? Learn Python!
  16. win 创建python虚拟环境
  17. Creating Python virtual environment with win
  18. In order to automatically collect B station barrage, I developed a tool in Python
  19. 用Python编程语言来实现阿姆斯特朗数的检查
  20. Using python programming language to check Armstrong number
  21. Python中的解决中文字符编码的问题
  22. Solving the problem of Chinese character coding in Python
  23. Translation: practical Python Programming 02_ 01_ Datatypes
  24. Installation and use of Python and tensorflow in win10 environment (Python version 3.6, tensorflow version 1.6)
  25. Python series 46
  26. Linux安装Python3
  27. 【python接口自动化】- 正则用例参数化
  28. Python RestFul Api 设计
  29. filecmp --- 文件及目录的比较│Python标准库
  30. Installing python3 on Linux
  31. [Python] Matplotlib 圖表的繪製和美化技巧
  32. (資料科學學習手札108)Python+Dash快速web應用開發——靜態部件篇(上)
  33. 翻譯:《實用的Python程式設計》02_01_Datatypes
  34. 【python接口自动化】- 正则用例参数化
  35. 翻译:《实用的Python编程》02_02_Containers
  36. 两年Java,去字节跳动写Python和Go
  37. [Python interface automation] - regular use case parameterization
  38. Python restful API design
  39. 翻译:《实用的Python编程》02_02_Containers
  40. 两年Java,去字节跳动写Python和Go
  41. 翻译:《实用的Python编程》02_02_Containers
  42. Python基于粒子群优化的投资组合优化研究
  43. ubuntu部署django项目
  44. 兩年Java,去位元組跳動寫Python和Go
  45. 翻譯:《實用的Python程式設計》02_02_Containers
  46. 这样学习Python,爷爷都学会了!超简单Python入门
  47. [Python] 基于 jieba 的中文分词总结
  48. 【python】递归听了N次也没印象,读完这篇你就懂了
  49. [Python] 基于 jieba 的中文分词总结
  50. 人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式
  51. [Python] 基於 jieba 的中文分詞總結
  52. Python属于后端开发还是前端开发?Python入门!
  53. 【python】递归听了N次也没印象,读完这篇你就懂了
  54. 一天快速入门python
  55. 学习Python对年龄有没有要求?30岁可以吗?
  56. 清华教授!12小时整理的最全Python教程(文末无偿分享)
  57. Filecmp -- comparison of files and directories
  58. Drawing and beautifying skills of [Python] Matplotlib chart
  59. Python + dash rapid web application development static components
  60. Translation: practical Python Programming 02_ 01_ Datatypes