在这里插入图片描述

# -*- coding:utf-8 -*-

'''
Created on 2019年1月7日

@author: Qiuyi
'''
import matplotlib.pyplot as plt
from matplotlib import animation
import pandas as pd
import numpy as np
import copy
import os
from matplotlib.font_manager import FontProperties 
font = FontProperties(fname=r'C:\Windows\Fonts\simsun.ttc')

homePath = r'D:\LearningFiles'
projectPath = os.path.join(homePath, 'MainCityGDP.csv')

data = pd.read_csv(projectPath, header=3, encoding = 'gbk')
data = data.fillna(0)

class City:
    def __init__(self, name):
        self.name = name
        self.set_color()

    def set_color(self, rgba = None):
        # RGB and RGBA are sequences of, respectively, 3 or 4 floats in the range 0-1.
        if not rgba:
            rgba = 'seagreen'
        self.color = rgba
        
    
def get_frames_cities(data):
    frames_cities = []
    city_list = []
    global year_list
    
    # 获取年份列表,减去地区列即可
    year_list = data.columns.tolist()

    dc = copy.deepcopy(data)
    
    # 得到不同年份的城市&GDP数据(两列),用于排序
    for i in range(len(year_list)-1, 1, -1):
        to_sort_data = dc.iloc[0:36, [0, i]]
        
        # 降序排序
        year = year_list[i]
        to_sort_data.sort_values(by=year, inplace=True)
        
        # 获取每年所有城市的GDP数据
        sorted_data = to_sort_data.iloc[:,[1]].values.tolist()
        # 获取排序后对应城市列表
        sorted_data_city = to_sort_data.iloc[:,[0]].values.tolist()
        
        # 将排序后的城市列表转换成City类
        city_set = [City(d) for d in sorted_data_city]
        
        frames_cities.append(sorted_data)
        city_list.append(city_set)
        
    return frames_cities, city_list
    
    
def draw_chart(frames_cities, city_list):
    fig = plt.figure(1, figsize=(12,6))
    ax = fig.add_subplot(111)
    
    def animate(i):
        ax.cla()
        ax.grid()
        barhs = []
        barhs += ax.barh(range(len(city_list[0])), [d for d in frames_cities[i]], color = [j.color for j in city_list[i]])
        plt.yticks(range(16), (j.name for j in city_list[i]), fontproperties=font, fontsize=15)
        plt.title(sorted(year_list)[i], fontproperties=font, fontsize=20)
        
        xmin, xmax = ax.get_xlim()
        if max([d for d in frames_cities[i]]) >= xmax:
            ax.set_xlim(xmin, 2*xmax)
            
        return barhs       
                 
    anim = animation.FuncAnimation(fig, animate, frames=len(frames_cities), interval=500, repeat=True)
    return plt, anim

frames_cities, city_list = get_frames_cities(data)

# 将武汉的柱形条设置为番茄红色
for i in city_list:
    for j in i:
        if j.name == ['武汉']:
            j.set_color('tomato')

# print([j.name for i in city_list for j in i])
# print([j.color for i in city_list for j in i])

# frames_cities是 19x36x1 的三维列表,取 20:36 列只显示 16个城市的排名
frames_cities = np.array(frames_cities).reshape(19,36)[:,20:36].tolist()
city_list = np.array(city_list)[:,20:36].tolist()

plt, anim = draw_chart(frames_cities, city_list)
anim.save('cityGDPVisualizing.gif',writer='imagemagick')
plt.show()
Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐