当前位置:   article > 正文

python数据可视化(饼图、世界地图、折线图、柱状图)_世界占比比饼图加地图

世界占比比饼图加地图

一、数据说明

数据有每个国家对应的近20年的对于儿童超重和营养不良占比和人数的三种类型(estimate字段)评估数据,一共四个sheet,就是儿童超重比例、儿童超重人数、儿童营养不良比例、儿童营养不良人数。

二、绘图思路和部分绘图效果

part1

要求:儿童超重情况可视化分析:对各国儿童超重的比例和人数进行划分,根据数值的大小区分超重的程度,绘制图表,统计并对比 2000 年与 2020 年不同程度分布情况;

思路:先提取出表中每个国家超重比例和超重人数,然后再提取对应的2000年与2020年数据,表中数据要从字符串型转为浮点型数据才能画图。查看每年数据的数值分布,确定轻度超重比例小于5.0,重度超重比例大于11.0,中度居中;轻度超重人数小于27万人,重度超重人数大于257万人,中度居中,画出四个饼图

part2

要求:绘制地理图,分析不同国家儿童营养不良的情况;

解决思路:先提取出每个国家重度营养不良的数据,对其所有年份数据求和,根据和还有国家名称绘制世界地图,世界地图生成html文件在同一目录下,打开文件即可在浏览器观察世界地图

part3

要求:根据不同程度,抽取排名前 3 的国家数据,整合数据分析儿童营养不良不同程度数据的差距情况;

解决思路:

根据第二部取出营养不良总和前三的国家,去原表中找到对应的数据,根据数据绘制三个国家轻度营养不良、中度营养不良、重度营养不良的折线图对比

part4:

要求:分析对比 2000 年与 2020 年各国儿童超重的比例和人数变动情况

解决思路:根据第一部处理的数据,提取前30个国家的数据绘制2000年与2020年的超重比例和人数柱状图

三、代码

存一下源码,方便以后用到回来看看

  1. import pandas as pd
  2. data_proportation = pd.read_excel('Country_Estimates_2021.xlsx',sheet_name = 'Overweight Proportion (Model)')
  3. data_numbers = pd.read_excel('Country_Estimates_2021.xlsx',sheet_name = 'Overweight Numb Affected(Model)')
  4. data_proportation_over = data_proportation[data_proportation['Estimate'] == 'Upper Uncertainty Bound']
  5. data_numbers_over = data_numbers[data_numbers['Estimate'] =='Upper Uncertainty Bound']
  6. data_proportation_over['2000'] = pd.to_numeric(data_proportation_over['2000'],errors='coerce')
  7. data_proportation_over['2020 1'] = pd.to_numeric(data_proportation_over['2020 1'],errors='coerce')
  8. data_numbers_over['2000'] = pd.to_numeric(data_numbers_over['2000'],errors='coerce')
  9. data_numbers_over['2020 1'] = pd.to_numeric(data_numbers_over['2020 1'],errors='coerce')
  10. from matplotlib import pyplot as plt
  11. from jupyterthemes import jtplot
  12. jtplot.style(theme='chesterish') #选择一个绘图主题
  13. plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示
  14. plt.rcParams['axes.unicode_minus'] = False
  15. print(data_proportation_over['2000'].describe())
  16. data_proportation_over_2000 = []
  17. data_proportation_over_2000.append(data_proportation_over['2000'][data_proportation_over['2000']<=5.0].count())
  18. data_proportation_over_2000.append(data_proportation_over['2000'][(data_proportation_over['2000']>=5.0) & (data_proportation_over['2000']<=11.0)].count())
  19. data_proportation_over_2000.append(data_proportation_over['2000'][data_proportation_over['2000']>=11.0].count())
  20. label = ['轻度超重', '中度超重', '重度超重'] # 刻度标签
  21. plt.figure(figsize=(6, 6)) # 将画布设定为正方形,则绘制的饼图是正圆
  22. explode = [0.01, 0.01, 0.01] # 设定各项离心n个半径
  23. plt.pie(data_proportation_over_2000,explode=explode, labels=label, autopct='%1.1f%%') # 绘制饼图
  24. plt.title('2000年世界超重儿童比例饼图') # 添加图表标题
  25. # plt.savefig('../tmp/2019年各年龄段年末总人口饼图.png')
  26. plt.show()
  27. print(data_proportation_over['2020 1'].describe())
  28. data_proportation_over_2020 = []
  29. data_proportation_over_2020.append(data_proportation_over['2020 1'][data_proportation_over['2020 1']<=5.0].count())
  30. data_proportation_over_2020.append(data_proportation_over['2020 1'][(data_proportation_over['2020 1']>=5.0) & (data_proportation_over['2020 1']<=11.0)].count())
  31. data_proportation_over_2020.append(data_proportation_over['2020 1'][data_proportation_over['2020 1']>=11.0].count())
  32. label = ['轻度超重', '中度超重', '重度超重'] # 刻度标签
  33. plt.figure(figsize=(6, 6)) # 将画布设定为正方形,则绘制的饼图是正圆
  34. explode = [0.01, 0.01, 0.01] # 设定各项离心n个半径
  35. plt.pie(data_proportation_over_2020,explode=explode, labels=label, autopct='%1.1f%%') # 绘制饼图
  36. plt.title('2000年世界超重儿童比例饼图') # 添加图表标题
  37. # plt.savefig('../tmp/2019年各年龄段年末总人口饼图.png')
  38. plt.show()
  39. print(data_numbers_over['2000'].describe())
  40. data_numbers_over_2000 = []
  41. data_numbers_over_2000.append(data_numbers_over['2000'][data_numbers_over['2000']<=27.0].count())
  42. data_numbers_over_2000.append(data_numbers_over['2000'][(data_numbers_over['2000']>=27.0) & (data_numbers_over['2000']<=257.0)].count())
  43. data_numbers_over_2000.append(data_numbers_over['2000'][data_numbers_over['2000']>=257].count())
  44. label = ['轻度超重', '中度超重', '重度超重'] # 刻度标签
  45. plt.figure(figsize=(6, 6)) # 将画布设定为正方形,则绘制的饼图是正圆
  46. explode = [0.01, 0.01, 0.01] # 设定各项离心n个半径
  47. plt.pie(data_numbers_over_2000,explode=explode, labels=label, autopct='%1.1f%%') # 绘制饼图
  48. plt.title('2020年世界超重儿童比例饼图') # 添加图表标题
  49. # plt.savefig('../tmp/2019年各年龄段年末总人口饼图.png')
  50. plt.show()
  51. print(data_numbers_over['2020 1'].describe())
  52. data_numbers_over_2020 = []
  53. data_numbers_over_2020.append(data_numbers_over['2020 1'][data_numbers_over['2020 1']<=27.0].count())
  54. data_numbers_over_2020.append(data_numbers_over['2020 1'][(data_numbers_over['2020 1']>=27.0) & (data_numbers_over['2020 1']<=257.0)].count())
  55. data_numbers_over_2020.append(data_numbers_over['2020 1'][data_numbers_over['2020 1']>=257].count())
  56. label = ['轻度超重', '中度超重', '重度超重'] # 刻度标签
  57. plt.figure(figsize=(6, 6)) # 将画布设定为正方形,则绘制的饼图是正圆
  58. explode = [0.01, 0.01, 0.01] # 设定各项离心n个半径
  59. plt.pie(data_numbers_over_2020,explode=explode, labels=label, autopct='%1.1f%%') # 绘制饼图
  60. plt.title('2020年世界超重儿童比例饼图') # 添加图表标题
  61. # plt.savefig('../tmp/2019年各年龄段年末总人口饼图.png')
  62. plt.show()
  63. data_proportation_Stunting = pd.read_excel('Country_Estimates_2021.xlsx',sheet_name = 'Stunting Proportion (Model)')
  64. #提取各国严重营养不良的数据
  65. data_proportation_Stunting_over_e = pd.DataFrame()
  66. data_proportation_Stunting_over = data_proportation_Stunting[data_proportation_Stunting['Estimate'] == 'Upper Uncertainty Bound']
  67. for i in ['2000','2001','2002','2003','2004','2005','2006','2007','2008','2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020 1']:
  68. data_proportation_Stunting_over_e[i] = pd.to_numeric(data_proportation_Stunting_over[i],errors='coerce')
  69. data_proportation_Stunting_over_e['行的和'] = data_proportation_Stunting_over_e.sum(axis=1)
  70. print(data_proportation_Stunting_over_e['行的和'])
  71. data_proportation_Stunting_over_e['country'] = data_proportation_Stunting_over['Country and areas']
  72. print(data_proportation_Stunting_over_e.head())
  73. list_data = []
  74. for i in data_proportation_Stunting_over_e.itertuples():
  75. list_data.append([getattr(i, 'country'),getattr(i, '行的和')])
  76. list_data
  77. from pyecharts import options as opts
  78. from pyecharts.charts import Map
  79. import rando
  80. def create_world_map(data):
  81. '''
  82. 作用:生成世界地图
  83. '''
  84. ( # 大小设置
  85. Map()
  86. .add(
  87. series_name="严重营养不良",
  88. data_pair=data,
  89. maptype="world",
  90. )
  91. # 全局配置项
  92. .set_global_opts(
  93. # 设置标题
  94. title_opts=opts.TitleOpts(title="世界地图"),
  95. # 设置标准显示
  96. visualmap_opts=opts.VisualMapOpts(max_=1000, is_piecewise=False),
  97. )
  98. # 系列配置项
  99. .set_series_opts(
  100. # 标签名称显示,默认为True
  101. label_opts=opts.LabelOpts(is_show=False, color="blue")
  102. )
  103. # 生成本地html文件
  104. .render("世界地图.html")
  105. )
  106. create_world_map(list_data)
  107. data_top_3 = data_proportation_Stunting_over_e.sort_values(by="行的和")
  108. data_top_3 = data_top_3.tail(3)
  109. print(data_top_3)
  110. list_top_3 = list(data_top_3['country'])
  111. print(list_top_3)
  112. data_top_3 =data_proportation_Stunting[(data_proportation_Stunting['Country and areas'] == 'Burundi')|(data_proportation_Stunting['Country and areas'] == 'Eritrea')|(data_proportation_Stunting['Country and areas'] == 'Timor-Leste')]
  113. data_top_3_point = data_top_3[data_top_3['Estimate'] =='Point Estimate']
  114. data_top_3_lower = data_top_3[data_top_3['Estimate'] =='Lower Uncertainty Bound']
  115. data_top_3_upper = data_top_3[data_top_3['Estimate'] =='Upper Uncertainty Bound']
  116. data_top_3_upper
  117. list_columns =['2000','2001','2002','2003','2004','2005','2006','2007','2008','2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020 1']
  118. plt.figure(figsize=(15, 10)) # 设置画布
  119. plt.plot(list_columns, data_top_3_point.iloc[0][list_columns], marker='o', c='red') # 绘制散点图
  120. plt.plot(list_columns, data_top_3_point.iloc[1][list_columns], marker='D', c='blue') # 绘制散点图
  121. plt.plot(list_columns, data_top_3_point.iloc[2][list_columns], marker='v', c='yellow') # 绘制散点图'''
  122. plt.xlabel('年份') # 添加横轴标签
  123. plt.ylabel('轻度营养不良') # 添加纵轴标签
  124. plt.title('2000-2020年各前三国家轻度营养不良散点图') # 添加图表标题
  125. plt.legend(['Burundi', 'Eritrea', 'Timor-Leste']) #添加图例
  126. #plt.savefig('../tmp/2000-2019年各年龄段年末总人口散点图.png')
  127. plt.show()
  128. plt.figure(figsize=(15, 10)) # 设置画布
  129. plt.plot(list_columns, data_top_3_lower.iloc[0][list_columns], marker='o', c='red') # 绘制散点图
  130. plt.plot(list_columns, data_top_3_lower.iloc[1][list_columns], marker='D', c='orange') # 绘制散点图
  131. plt.plot(list_columns, data_top_3_lower.iloc[2][list_columns], marker='v', c='yellow') # 绘制散点图'''
  132. plt.xlabel('年份') # 添加横轴标签
  133. plt.ylabel('轻度营养不良') # 添加纵轴标签
  134. plt.title('2000-2020年各前三国家重度营养不良散点图') # 添加图表标题
  135. plt.legend(['Burundi', 'Eritrea', 'Timor-Leste']) #添加图例
  136. #plt.savefig('../tmp/2000-2019年各年龄段年末总人口散点图.png')
  137. plt.show()
  138. plt.figure(figsize=(15, 10)) # 设置画布
  139. plt.plot(list_columns, data_top_3_upper.iloc[0][list_columns], marker='o', c='red',linestyle='--') # 绘制散点图
  140. plt.plot(list_columns, data_top_3_upper.iloc[1][list_columns], marker='D', c='green') # 绘制散点图
  141. plt.plot(list_columns, data_top_3_upper.iloc[2][list_columns], marker='v', c='yellow') # 绘制散点图'''
  142. plt.xlabel('年份') # 添加横轴标签
  143. plt.ylabel('轻度营养不良') # 添加纵轴标签
  144. plt.title('2000-2020年各前三国家中度营养不良散点图') # 添加图表标题
  145. plt.legend(['Burundi', 'Eritrea', 'Timor-Leste']) #添加图例
  146. #plt.savefig('../tmp/2000-2019年各年龄段年末总人口散点图.png')
  147. plt.show()
  148. data_proportation_over = data_proportation_over.head(20)
  149. data_numbers_over = data_numbers_over.head(20)
  150. import numpy as np
  151. length = len(data_proportation_over['2000'])
  152. x = np.arange(length)
  153. plt.figure()
  154. total_width, n = 0.8, 2 # 柱状图总宽度,有几组数据
  155. width = total_width / n # 单个柱状图的宽度
  156. x1 = x - width / 2 # 第一组数据柱状图横坐标起始位置
  157. x2 = x1 + width # 第二组数据柱状图横坐标起始位置
  158. plt.figure(figsize=(30, 10))
  159. plt.title("不同国家2000年与2020年超重比例指标对比") # 柱状图标题
  160. plt.ylabel("超重比例") # 纵坐标label
  161. plt.bar(x1, data_proportation_over['2000'], width=width, label="2000年")
  162. plt.bar(x2, data_proportation_over['2020 1'], width=width, label="2020年")
  163. plt.xticks(x, data_proportation_over['Country and areas']) # 用星期几替换横坐标x的值
  164. plt.legend() # 给出图例
  165. plt.show()
  166. length = len(data_numbers_over['2000'])
  167. x = np.arange(length)
  168. plt.figure()
  169. total_width, n = 0.8, 2 # 柱状图总宽度,有几组数据
  170. width = total_width / n # 单个柱状图的宽度
  171. x1 = x - width / 2 # 第一组数据柱状图横坐标起始位置
  172. x2 = x1 + width # 第二组数据柱状图横坐标起始位置
  173. plt.figure(figsize=(30, 10))
  174. plt.title("不同国家2000年与2020年超重人数对比") # 柱状图标题
  175. plt.ylabel("超重人数") # 纵坐标label
  176. plt.bar(x1, data_numbers_over['2000'], width=width,color ='yellow' ,label="2000年")
  177. plt.bar(x2, data_numbers_over['2020 1'], width=width,color='red' , label="2020年")
  178. plt.xticks(x, data_numbers_over['Country and areas']) # 用星期几替换横坐标x的值
  179. plt.legend() # 给出图例
  180. plt.show()

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/286623
推荐阅读
相关标签
  

闽ICP备14008679号