数学建模学习8

o奖论文——F

P1——10页

1、找数据

我们选择了2009年至2018年期间来自50个国家的14个指标的原始数据。然后通过柯尔莫戈罗夫-Smirnov检验验证了数据的分布规律,并选择80%的分位数作为接受范围(健康范围)

2、我们使用分析层次过程来确定每个指标的权重。该结果可以用来衡量特定国家的健康状况。我们还建立了使用dea-马尔姆奎斯特模型来检验可持续性的方法。•

3、代入国家

然后,我们将我们的模型应用到五个选定的国家

4、,我们选择了具有较大上行潜力的印度,作为我们研究的案例。在评估了其地位后,我们建立了我们的愿景,并制定了有针对性的政策。然后,我们使用马尔可夫链来预测我们的政治的影响,并绘制出预测的时间线。

用到的代码实现

1、绘制地图代码(世界、中国)

2、层次分析法代码实现

3、双层饼状图的绘制

注1、3为代码转载

#世界地图
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType#主题
'''map = (
    Map()
    .add("", [list(z) for z in zip(Faker.country, Faker.values())], "world")
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Map-世界地图",pos_right='center'),
        visualmap_opts=opts.VisualMapOpts(max_=200),)
)'''
#单独调用
map = Map(init_opts=opts.InitOpts(bg_color="#AAFFEE", theme=ThemeType.ROMANTIC))
country = ["China", "Canada", "Brazil", "Russia", "United States", "Africa", "Germany"]
value = [300, 100, 2000, 800, 10000, 400, 5000]
map.add("", [list(z) for z in zip(country, value)], "world")
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
map.set_global_opts(
         title_opts=opts.TitleOpts(title="Map-世界地图"),
          visualmap_opts=opts.VisualMapOpts(max_=5000),)

map.render('d://map.html')
%层次分析
disp('请输入判断矩阵A')
A=input('A=');
[n,n] = size(A);
% % % % % % % % % % % % %方法1: 算术平均法求权重% % % % % % % % % % % % %
Sum_A = sum(A);
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;

disp('算术平均法求权重的结果为:');
disp(sum(Stand_A,2)./n)
% % % % % % % % % % % % %方法2: 几何平均法求权重% % % % % % % % % % % % %
Prduct_A = prod(A,2);
Prduct_n_A = Prduct_A .^ (1/n)
disp('几何平均法求权重的结果为:');
disp(Prduct_n_A ./ sum(Prduct_n_A))
% % % % % % % % % % % % %方法3: 特征值法求权重% % % % % % % % % % % % %
[V,D] = eig(A);
Max_eig = max(max(D));
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
disp( V(:,c) ./ sum(V(:,c)) )

% % % % % % % % % % % % %下面是计算一致性比例CR的环节% % % % % % % % % % % % %
CI = (Max_eig - n) / (n-1);
RI=[0 0.0001 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59];  %注意哦,这里的RI最多支持 n = 15
% 这里n=2时,一定是一致矩阵,所以CI = 0,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数
CR=CI/RI(n);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
    disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');
else
    disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');
end
#双层饼状图
from matplotlib import pyplot as plt
import numpy as np

size = 0.25
base = 50

plt.rcParams['font.family'] = 'SimHei'
fig, ax = plt.subplots(figsize=(10, 10))

vals_middle = np.array([
    [47.5, 11.7, 15.2, 9.6],
    [0, 44.8, 7.5, 0],
    [9.2, 68.5, 0, 0],
    [1.2, 7.2, 0, 0],
    [80, 0, 0, 0],
    [1.7, 18.9, 0, 0]
])

vals_outer = np.array([
    [47.5, 11.7, 15.2, 9.6],
    [0, 36.6, 8.2, 7.5],
    [9.2, 38.1, 30.4, 0],
    [1.2, 5.8, 1.4, 0],
    [80, 0, 0, 0],
    [1.7, 18.9, 0, 0]
])

vals_inner = vals_middle.sum(axis=1)

# 最内圈使用的数值为内圈各类数据加上base
vals_first = vals_inner + base

'''
第二圈使用的数值, 因为最内圈每个类别都加上了base, 所以为了确保第二圈的数值和内圈相匹配, 第二圈的各类别要按照各自所占的比例分配各类的总数值.
'''
vals_second = np.zeros((6, 4))
for i in range(6):
    s_a = vals_first[i]
    s_b = vals_middle[i].sum()
    # 如果第二圈某类总数值为0, 则分配base.
    if s_b == 0.0:
        vals_second[i][1] = base
        continue
    for j in range(4):
        vals_second[i][j] = (vals_middle[i][j] / s_b) * s_a

# 第三圈使用的数值, 和上方同理
vals_third = np.zeros((6, 4))
for i in range(6):
    s_a = vals_first[i]
    s_b = vals_outer[i].sum()
    if s_b == 0.0:
        vals_third[i][1] = base
        continue
    for j in range(4):
        vals_third[i][j] = (vals_outer[i][j] / s_b) * s_a

# 获取colormap tab20c和tab20b的颜色
cmap_c = plt.get_cmap("tab20c")
cmap_b = plt.get_cmap("tab20b")

# 使用tab20c的全部颜色和tab20b中的 5至8 颜色
cmap_1 = cmap_c(np.arange(20))
cmap_2 = cmap_b(np.array([4, 5, 6, 7]))

# 内圈的颜色是每4个颜色中色彩最深的那个. vstack是将两类颜色叠加在一起
inner_colors = np.vstack((cmap_1[::4], cmap_2[0]))
# 外圈的颜色是全部24种颜色
outer_colors = np.vstack((cmap_1, cmap_2))

labels_first = ["餐厨废弃物\n{}万吨".format(vals_inner[0]),
                "农业秸秆\n{}万吨".format(vals_inner[1]),
                "水草\n151.2万吨",
                "园林绿化\n废弃物\n{}万吨".format(vals_inner[3]),
                "淤泥\n432.0万吨",
                "畜禽粪便\n21.6万吨"
                ]

labels_seocnd = [
    "未分类收集\n67.6万吨",
    "生物干化\n3.7万吨",
    "厌氧发酵\n10.2万吨",
    "油水分离\n2.6万吨",

    "",
    "粉碎\n46.8万吨",
    "好氧发酵\n3.5万吨",
    "",

    "未处理\n4.2万吨",
    "藻水分离\n147.0万吨",
    "",
    "",

    "未处理\n1.2万吨",
    "粉碎\n7.2万吨",
    "",
    "",

    "堆放\n432.0万吨",
    "",
    "",
    "",

    "未处理\n0.7万吨",
    "好氧发酵\n19.9万吨",
    "",
    "",
]

labels_third = [
    "未处理\n67.5万吨",
    "肥料化、发电\n3.7万吨",
    "沼气、沼渣发电\n10.2万吨",
    "焚烧\n2.6万吨",

    "",
    "还田\n42.6万吨",
    "燃料化\n4.2万吨",
    "肥料化\n3.5万吨",

    "未利用\n4.2万吨",
    "燃料化\n80.2万吨",
    "肥料化\n66.8万吨",
    "",

    "未利用\n1.2万吨",
    "肥料化\n5.8万吨",
    "燃料化\n1.4万吨",
    "",

    "未利用\n432.0万吨",
    "",
    "",
    "",

    "未利用\n0.7万吨",
    "肥料化\n19.9万吨",
    "",
    "",
]

handles, labels = ax.pie(vals_first, radius=1 - size - size,
                         labels=labels_first,
                         labeldistance=0.5, rotatelabels=True, textprops={'fontsize': 11},
                         colors=inner_colors, wedgeprops=dict(width=size, edgecolor='w'))

ax.pie(vals_second.flatten(), radius=1 - size, colors=outer_colors,
       labels=labels_seocnd,
       labeldistance=0.7, rotatelabels=True, textprops={'fontsize': 11},
       wedgeprops=dict(width=size, edgecolor='w'))

ax.pie(vals_third.flatten(), radius=1, colors=outer_colors,
       labels=labels_third,
       labeldistance=0.8, rotatelabels=True, textprops={'fontsize': 11},
       wedgeprops=dict(width=size, edgecolor='w'))

plt.title('某市有机废弃物产生、处理、利用情况', fontsize=25)
plt.legend(handles=handles, labels=[
    "餐厨废弃物",
    "农业秸秆",
    "水草",
    "园林绿化废弃物",
    "淤泥",
    "畜禽粪便"],
           loc=1
           )
plt.legend(bbox_to_anchor=(1.2,1.12))
plt.show()

上一篇:使用python对excel表格商业数据可视化分析


下一篇:【转载】jqdatasdk用pyechart画图生成网页并保存到本地