Python期末大作业

发布时间:2024-02-22 13:30

先进行一些库的引入和常规操作

# 数据分析三兄弟
import numpy as np 
import matplotlib.pyplot as plt
import pandas as pd
# 分别是视频、音频处理的库
import cv2
from moviepy.editor import *

# 中文编码
plt.rcParams[\'font.sans-serif\'] = [\'YouYuan\']
plt.rcParams[\'axes.unicode_minus\'] = False
# 读取文件,简单处理
data = pd.read_excel(\'国家地铁里程历程.xlsx\')
data = data.rename(columns={\'Unnamed:0\': \'年份\'})

1.每一列最前面的正整数之前全部设为0

2.每一列空格部分都使用前后两个值进行“线性插值”填空,以月为单位进行插值

# 建立一个标题与原表相同的空表
df = pd.DataFrame(columns=data.columns)
# 处理这个空表,插入一行原来data的行,再插入11行空行
for i in range(0, 123):
    df = pd.concat([df, data.loc[i:i, :]])
    for j in range(0, 11):
        df = pd.concat([df, pd.DataFrame([{\"\": np.nan}], columns=data.columns)], ignore_index=True)
# 加上最后一行
df = pd.concat([df, data.loc[123:123, :]])
df = df.set_index(\'Unnamed: 0\')
df = df.interpolate()
# 取出1900年后的
df = df.loc[1900:]
df = df.fillna(0)
df = df.reset_index()
# 取出年作为后面要用的标签
nian = df.iloc[:, 0]
nian = nian.fillna(method=\'ffill\')
# 取出数据部分
df = df.iloc[:, 1:]

  1. 每幅图显示里程数最多的10个国家,当不到10个时,全部绘制。
  2. 绘图时里程数大的在上放,小的在下方。
  3. 每个国家对应的颜色自行定义,且保持不变,其中中国须为红色。
  4. 图中每条bar须列明国名。
  5. 图中每条bar须标注数值,数值保留小数点后2位有效数字。
# 将地区和颜色对应
area_list = df.columns
color_list = [\'#DDDDDD\', \'#FF44AA\', \'#FF5511\', \'#886600\', \'#FFFF33\', \'#77FF00\', \'#77FFEE\', \'#003C9D\', \'#D28EFF\',
              \'#770077\', \'#FF0000\']
colors = dict(zip(area_list, color_list))
# 绘制图表
plt.rcParams[\'axes.facecolor\'] = \'#FFE4E1\'
plt.figure(figsize=(15, 8), dpi=80, facecolor=\'#FFE4E1\')

for i in range(0, len(df)):
    # 画表
    plt.xlabel(\"公里数\", fontsize=25)
    plt.ylabel(\"国家\", fontsize=25)
    plt.tick_params(labelsize=25)
    plt.title(\"全球各国铁路里程\", fontsize=30)
    ax = plt.subplot()
    ax.spines[\'top\'].set_visible(False)
    ax.spines[\'right\'].set_visible(False)

    # 排序
    df = df.sort_values(by=i, axis=1)
    # 保留前10个
    x = df.columns[1:]
    y = df.iloc[i, 1:]
    plt.barh(x, y, color=[colors[t] for t in x])
    ax = plt.gca()

    #添加标签和水印
    plt.text(0.8, 0.1, s=int(nian[i]), transform=ax.transAxes, fontsize=50)
    plt.text(0.5, 0.5, s=\'水印\', transform=ax.transAxes, fontsize=50, alpha=0.4)
    for j in range(0, len(x)):
        plt.text(y[j] + 0.5, x[j], s=str(\'{:.2f}KM\'.format(y[j])), fontsize=20)

    # plt.show()
    # 保存
    plt.savefig(r\"img\\t{}.jpg\".format(i))
    plt.clf()
    

 将多幅图片组织为mp4格式视频,帧率设置为每秒12帧。

# 读取中文路径
# 前面不能出现中文路径,否则需要加上这段
def cv_imread(filePath):
    cv_img = cv2.imdecode(np.fromfile(filePath, dtype=np.uint8), -1)
    return cv_img


# 视频合成
size = (1200, 640)
videowrite = cv2.VideoWriter(\'test.mp4\', -1, 12, size)  # 12表示帧率
img_array = []
for filename in [r\"img/t{}.jpg\".format(i) for i in range(1453)]:
    img = cv_imread(filename)
    if img is None:
        print(filename + \" is not found.\")
        continue
    img_array.append(img)

for i in range(1453):
    videowrite.write(img_array[i])

videowrite.release()
print(\'over\')

加一个bgm

# 加bgm
video_clip = VideoFileClip(\'test.mp4\')
audio_clip = AudioFileClip(\'china—x.mp3\')
audio = afx.audio_loop(audio_clip, duration=video_clip.duration)
final_video = video_clip.set_audio(audio)
final_video.write_videofile(\'china—x.mp4\')

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号