草庐IT

python数据可视化--制作世界人口地图:JSON格式文件

Z_bioinfo 2023-03-28 原文

数据来源:population_data.json,

先看一下数据长啥样
[
  {
    "Country Name": "Arab World",
    "Country Code": "ARB",
    "Year": "1960",
    "Value": "96388069"
  },
  {
    "Country Name": "Arab World",
    "Country Code": "ARB",
    "Year": "1961",
    "Value": "98882541.4"
  },
省略。。。。
]

'''这个文件实际上就是一个很长的Python列表,其中每个元素都是一个包含四个键的字典:
国家名、国别码、年份以及表示人口数量的值。
我们只关心每个国家2010年的人口数量,因此我们首先编写一个打印这些信息的程序:'''

import json

#将数据加载到一个列表中
filename= 'population_data.json'

with open(filename) as f :
    pop_data = json.load(f)
#打印每个国家2010年的人口数量
for pop_dic in pop_data :
     if pop_dic["Year"] == '2010' :
         country_name= pop_dic['Country Name']
         population =int(float(pop_dic['Value']) )#population_data.json中的每个键和值都是字符串。为处理这些人口数据,我们需要将表示人口数量的字符串转换为数字值,为此我们使用函数int():
         print(country_name + ":" + str(population))
rab World:357868000
Caribbean small states:6880000
East Asia & Pacific (all income levels):2201536674
East Asia & Pacific (developing only):1961558757
Euro area:331766000
Europe & Central Asia (all income levels):890424544
Europe & Central Asia (developing only):405204000

获取两个字母的国别码

'''制作地图前,还需要解决数据存在的最后一个问题。Pygal中的地图制作工具要求数据为特定的格式:用国别码表示国
家,以及用数字表示人口数量。处理地理政治数据时,经常需要用到几个标准化国别码集。population_data.json中包含
的是三个字母的国别码,但Pygal使用两个字母的国别码。我们需要想办法根据国家名获取两个字母的国别码。

Pygal使用的国别码存储在模块i18n(internationalization的缩写)中。字典COUNTRIES包含的键和值分别为两个字母的国别码
和国家名。要查看这些国别码,可从模块i18n中导入这个字典,并打印其键和值:'''

from pygal_maps_world.i18n import COUNTRIES

for country_code in sorted(COUNTRIES.keys()):
    print(country_code, COUNTRIES[country_code])
ad Andorra
ae United Arab Emirates
af Afghanistan
al Albania
为获取国别码,我们将编写一个函数,它在COUNTRIES中查找并返回国别码。我们将这个函数放在一个名为country_codes的模块中,以便能够在可视化程序中导入它:
from pygal_maps_world.i18n import COUNTRIES


def get_country_code(country_name):
    #根据指定的国家,返回Pygal使用的两个字母的国别码
    for code,name in COUNTRIES.items():
        if name == country_name :
            return code
    # 如果没有找到指定的国家,就返回None
    return None



#打印每个国家2010年的人口数量
for pop_dic in pop_data :
     if pop_dic["Year"] == '2010' :
         country_name= pop_dic['Country Name']
         population =int(float(pop_dic['Value']) )#population_data.json中的每个键和值都是字符串。为处理这些人口数据,我们需要将表示人口数量的字符串转换为数字值,为此我们使用函数int():
         code =  get_country_code(country_name)
         if code :
                
             print(code + ":" + str(population))
            
         else:
            print('error - ' + ":" + str(population))
error - :357868000
error - :6880000
error - :2201536674
error - :1961558757
error - :331766000

导致显示错误消息的原因有两个。首先,并非所有人口数量对应的都是国家,有些人口数量对应的是地区(阿拉伯世界)和经济类群(所有收入水平)。其次,有些统计数据使用了不同的完整国家名(如Yemen, Rep.,而不是Yemen)。当前,我们将忽略导致错误的数据,看看根据成功恢复了的数据制作出的地图是什么样的。

制作世界地图

import pygal_maps_world.maps#创建了一个Worldmap实例,并设置了该地图的的title属性

wm = pygal_maps_world.maps.World()
wm.title = 'North, Central, and South America'
'''
了方法add(),它接受一个标签和一个列表,其中后者包含我们要突出的国家的国别码。每次调用add()都将为指定的国家
选择一种新颜色,并在图表左边显示该颜色和指定的标签。我们要以同一种颜色显示整个北美地区,因此第一次调用add()
时,在传递给它的列表中包含'ca'、'mx'和'us',以同时突出加拿大、墨西哥和美国。接下来,对中美和南美国家做同样
的处理。
'''
wm.add('North America', ['ca', 'mx', 'us'])
wm.add('Central America', ['bz', 'cr', 'gt', 'hn', 'ni', 'pa', 'sv'])
wm.add('South America', ['ar', 'bo', 'br', 'cl', 'co', 'ec', 'gf',
'gy', 'pe', 'py', 'sr', 'uy', 've'])


'''
方法render_to_file()创建一个包含该图表的.svg文件,你可以在浏览器中打开它。输出是一幅以不同颜色突出北美、
中美和南美的地图
'''
wm.render_to_file('americas.svg')
image.png

绘制完整的世界人口地图

'''要呈现其他国家的人口数量,需要将前面处理的数据转换为Pygal要求的字典格式:键为两个字母的国别码,值为人口数量。为此,在world_population.py中添加如下代码:'''
import json

#将数据加载到一个列表中
filename= 'population_data.json'
with open(filename) as f :
    pop_data = json.load(f)

def get_country_code(country_name):
    #根据指定的国家,返回Pygal使用的两个字母的国别码
    for code,name in COUNTRIES.items():
        if name == country_name :
            return code
    # 如果没有找到指定的国家,就返回None
    return None

#创建一个包含人口数量是字典
cc_populations = {}
#打印每个国家2010年的人口数量
for pop_dic in pop_data :
     if pop_dic["Year"] == '2010' :
         country_name= pop_dic['Country Name']
         population =int(float(pop_dic['Value']) )#population_data.json中的每个键和值都是字符串。为处理这些人口数据,我们需要将表示人口数量的字符串转换为数字值,为此我们使用函数int():
         code =  get_country_code(country_name)
         if code :
            cc_populations[code] =  population
            
import pygal_maps_world.maps#创建了一个Worldmap实例,并设置了该地图的的title属性

wm = pygal_maps_world.maps.World()
wm.title = 'world population in 2010, by country'

wm.add('2010', cc_populations)


wm.render_to_file('world_population.svg')
image.png

根据人口数量将国家分组

import json

#将数据加载到一个列表中
filename= 'population_data.json'
with open(filename) as f :
    pop_data = json.load(f)

def get_country_code(country_name):
    #根据指定的国家,返回Pygal使用的两个字母的国别码
    for code,name in COUNTRIES.items():
        if name == country_name :
            return code
    # 如果没有找到指定的国家,就返回None
    return None

#创建一个包含人口数量是字典
cc_populations = {}
#打印每个国家2010年的人口数量
for pop_dic in pop_data :
     if pop_dic["Year"] == '2010' :
         country_name= pop_dic['Country Name']
         population =int(float(pop_dic['Value']) )#population_data.json中的每个键和值都是字符串。为处理这些人口数据,我们需要将表示人口数量的字符串转换为数字值,为此我们使用函数int():
         code =  get_country_code(country_name)
         if code :
            cc_populations[code] =  population

###根据人口数量将国家分3组   
cc_pop_1,cc_pop_2,cc_pop_3 = {},{},{}
for cc,pop in cc_populations.items():
    if pop < 10000000:
        cc_pop_1[cc] = pop
    elif pop < 1000000000:
        cc_pop_2[cc] = pop
    else:
        cc_pop_3[cc] = pop

import pygal_maps_world.maps#创建了一个Worldmap实例,并设置了该地图的的title属性

wm = pygal_maps_world.maps.World()
wm.title = 'world population in 2010, by country'

wm.add('0-10m', cc_pop_1)
wm.add('10m-1bn', cc_pop_2)
wm.add('> 1bn', cc_pop_3)


wm.render_to_file('world_population.svg')
image.png

根据Pygal设置世界地图的样式

'''
在这个地图中,根据人口将国家分组虽然很有效,但默认的颜色设置很难看。例如,在这里,Pygal选择了鲜艳的粉色
和绿色基色。下面使用Pygal样式设置指令来调整颜色。我们也让Pygal使用一种基色,但将指定该基色,并让三个分组
的颜色差别更大
'''

###根据Pygal设置世界地图的样式
'''
在这个地图中,根据人口将国家分组虽然很有效,但默认的颜色设置很难看。例如,在这里,Pygal选择了鲜艳的粉色
和绿色基色。下面使用Pygal样式设置指令来调整颜色。我们也让Pygal使用一种基色,但将指定该基色,并让三个分组
的颜色差别更大
'''
###根据人口数量将国家分组



import json

#将数据加载到一个列表中
filename= 'population_data.json'
with open(filename) as f :
    pop_data = json.load(f)

def get_country_code(country_name):
    #根据指定的国家,返回Pygal使用的两个字母的国别码
    for code,name in COUNTRIES.items():
        if name == country_name :
            return code
    # 如果没有找到指定的国家,就返回None
    return None

#创建一个包含人口数量是字典
cc_populations = {}
#打印每个国家2010年的人口数量
for pop_dic in pop_data :
     if pop_dic["Year"] == '2010' :
         country_name= pop_dic['Country Name']
         population =int(float(pop_dic['Value']) )#population_data.json中的每个键和值都是字符串。为处理这些人口数据,我们需要将表示人口数量的字符串转换为数字值,为此我们使用函数int():
         code =  get_country_code(country_name)
         if code :
            cc_populations[code] =  population

###根据人口数量将国家分3组   
cc_pop_1,cc_pop_2,cc_pop_3 = {},{},{}
for cc,pop in cc_populations.items():
    if pop < 10000000:
        cc_pop_1[cc] = pop
    elif pop < 1000000000:
        cc_pop_2[cc] = pop
    else:
        cc_pop_3[cc] = pop

import pygal_maps_world.maps#创建了一个Worldmap实例,并设置了该地图的的title属性
from pygal.style import RotateStyle
from pygal.style import LightColorizedStyle#加亮颜色主题

wm_style = RotateStyle('#336699', base_style= LightColorizedStyle)
wm = pygal_maps_world.maps.World(style = wm_style)
wm.title = 'world population in 2010, by country'

wm.add('2010', cc_populations)
wm.add('0-10m', cc_pop_1)
wm.add('10m-1bn', cc_pop_2)
wm.add('> 1bn', cc_pop_3)



wm.render_to_file('world_population.svg')
image.png

有关python数据可视化--制作世界人口地图:JSON格式文件的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. ruby - Ruby 中的波形可视化 - 2

    我即将开始一个将录制和编辑音频文件的项目,我正在寻找一个好的库(最好是Ruby,但会考虑Java或.NET以外的任何库)以进行实时可视化波形。有人知道我应该从哪里开始搜索吗? 最佳答案 要流入浏览器的数据量很大。Flash或Flex图表可能是唯一能提高内存效率的解决方案。Javascript图表往往会因大型数据集而崩溃。 关于ruby-Ruby中的波形可视化,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  6. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  7. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐