<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 城市公交網(wǎng)絡(luò)分析與可視化

          共 12262字,需瀏覽 25分鐘

           ·

          2021-02-24 19:43

          一、數(shù)據(jù)查看和預(yù)處理

          數(shù)據(jù)獲取自高德地圖API,包含了天津市公交線路和站點(diǎn)名稱及其經(jīng)緯度數(shù)據(jù)。

          import?pandas?as?pd

          df?=?pd.read_excel('site_information.xlsx')
          df.head()

          字段說(shuō)明:
          • 線路名稱:公交線路的名稱
          • 上下行:0表示上行;1表示下行
          • 站序號(hào):公交線路上行或下行依次經(jīng)過(guò)站的序號(hào)
          • 站名稱:站點(diǎn)名稱
          • 經(jīng)度(分):站點(diǎn)的經(jīng)度
          • 緯度(分):站點(diǎn)的緯度

          數(shù)據(jù)字段少,結(jié)構(gòu)也比較簡(jiǎn)單,下面來(lái)充分了解我們的數(shù)據(jù)和進(jìn)行預(yù)處理。總的數(shù)據(jù)有 30396 條,站名稱缺失了 5 條,緯度(分)缺失了 1 條,經(jīng)度(分)缺失了 38 條,為了處理方便,直接把有缺失值的行刪除。

          經(jīng)緯度數(shù)據(jù)是7031.982、2348.1016這樣的,需要將其轉(zhuǎn)換為以度為單位。
          df2?=?df1.copy()
          df2['經(jīng)度(分)']?=?df1['經(jīng)度(分)'].apply(float)?/?60
          df2['緯度(分)']?=?df1['緯度(分)'].apply(float)?/?60
          df2.head()

          處理后的數(shù)據(jù)里,共有 618 條公交線路,4851個(gè)站點(diǎn)數(shù)據(jù)。

          重新保存為處理后數(shù)據(jù)
          df2.to_excel("處理后數(shù)據(jù).xlsx",?index=False)

          二、數(shù)據(jù)分析

          分析天津市公交站點(diǎn)的分布情況
          #?-*-?coding:?UTF-8?-*-
          """
          @Author ?:葉庭云
          @公眾號(hào)??:修煉Python
          @CSDN ???:https://yetingyun.blog.csdn.net/
          """

          import?pandas?as?pd
          import?matplotlib.pyplot?as?plt
          import?matplotlib?as?mpl
          import?random

          df?=?pd.read_excel("處理后數(shù)據(jù).xlsx")
          x_data?=?df['經(jīng)度(分)']
          y_data?=?df['緯度(分)']
          colors?=?['#FF0000',?'#0000CD',?'#00BFFF',?'#008000',?'#FF1493',?'#FFD700',?'#FF4500',?'#00FA9A',?'#191970',?'#9932CC']
          colors?=?[random.choice(colors)?for?i?in?range(len(x_data))]
          mpl.rcParams['font.family']?=?'SimHei'
          plt.style.use('ggplot')
          #?設(shè)置大小
          plt.figure(figsize=(12,?6),?dpi=200)
          #?繪制散點(diǎn)圖??經(jīng)度??緯度??傳進(jìn)去???設(shè)置?顏色??點(diǎn)的大小
          plt.scatter(x_data,?y_data,?marker="o",?s=9.,?c=colors)

          #?添加描述信息?x軸?y軸?標(biāo)題
          plt.xlabel("經(jīng)度")
          plt.ylabel("緯度")
          plt.title("天津市公交站點(diǎn)分布情況")
          plt.savefig('經(jīng)緯度散點(diǎn)圖.png')
          plt.show()

          結(jié)果如下:

          通過(guò) matplotlib 繪制散點(diǎn)圖可視化天津市公交站點(diǎn)的分布情況,容易看出天津市的公交熱點(diǎn)分布區(qū)域。為了能更形象地分析公交線路網(wǎng)絡(luò),我們還可以將數(shù)據(jù)可視化在實(shí)際地圖上,利用 Pyecharts 的BMap。

          #?-*-?coding:?UTF-8?-*-
          """
          @Author ?:葉庭云
          @公眾號(hào)??:修煉Python
          @CSDN ???:https://yetingyun.blog.csdn.net/
          """

          import?pandas?as?pd
          from?pyecharts.charts?import?BMap
          from?pyecharts?import?options?as?opts
          from?pyecharts.globals?import?CurrentConfig

          #?引用本地js資源渲染
          CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'

          df?=?pd.read_excel('處理后數(shù)據(jù).xlsx',?encoding='utf-8')
          df.drop_duplicates(subset='站名稱',?inplace=True)
          longitude?=?list(df['經(jīng)度(分)'])
          latitude?=?list(df['緯度(分)'])
          datas?=?[]
          a?=?[]
          for?i,?j?in?zip(longitude,?latitude):
          ????a.append([i,?j])

          datas.append(a)
          print(datas)

          BAIDU_MAP_AK?=?"改成你的百度地圖AK"

          c?=?(
          ????BMap(init_opts=opts.InitOpts(width="1200px",?height="800px"))
          ????.add_schema(
          ????????baidu_ak=BAIDU_MAP_AK,?????#?申請(qǐng)的BAIDU_MAP_AK
          ????????center=[117.20,?39.13],????#?天津市經(jīng)緯度中心
          ????????zoom=10,
          ????????is_roam=True,
          ????)
          ????.add(
          ????????"",
          ????????type_="lines",
          ????????is_polyline=True,
          ????????data_pair=datas,
          ????????linestyle_opts=opts.LineStyleOpts(opacity=0.2,?width=0.5,?color='red'),
          ????????#?如果不是最新版本的話可以注釋下面的參數(shù)(效果差距不大)
          ????????progressive=200,
          ????????progressive_threshold=500,
          ????)
          )

          c.render('公交網(wǎng)絡(luò)地圖.html')

          結(jié)果如下:

          在實(shí)際地圖上可以看到,和平區(qū)、南開(kāi)區(qū)公交線路網(wǎng)絡(luò)密集,交通便利。

          公交線路網(wǎng)絡(luò)中 i 節(jié)點(diǎn)代表第 i 條線路,其中節(jié)點(diǎn) i 的度定義為與線路 i 可以經(jīng)過(guò)換乘能夠到達(dá)的線路的數(shù)目,線路網(wǎng)絡(luò)中度的大小反映了該條公交線路與其他線路的連通程度,構(gòu)建算法分析公交線路網(wǎng)絡(luò)中節(jié)點(diǎn)度的分布。
          #?-*-?coding:?UTF-8?-*-
          """
          @Author ?:葉庭云
          @公眾號(hào)??:修煉Python
          @CSDN ???:https://yetingyun.blog.csdn.net/
          """

          import?xlrd
          import?matplotlib.pyplot?as?plt
          import?pandas?as?pd
          import?matplotlib?as?mpl


          df?=?pd.read_excel("site_information.xlsx")
          #?用pandas的操作去重???得到每條線路的名稱
          loc?=?df['線路名稱'].unique()
          #?得到每一條線路名稱的列表
          line_list?=?list(loc)
          print(line_list)

          #?打開(kāi)Excel表格
          data?=?xlrd.open_workbook("site_information.xlsx")
          #?print(data)???#??在內(nèi)存中
          #?獲取特定Sheet??索引為0??也就是第一個(gè)表
          table?=?data.sheets()[0]??#?從零開(kāi)始
          #?每條線路對(duì)應(yīng)有哪些站點(diǎn)??字典推導(dǎo)式
          site_dic?=?{k:?[]?for?k?in?line_list}
          site_list?=?[]
          for?i?in?range(1,?table.nrows):
          ????#?每一行的數(shù)據(jù)???返回的是一個(gè)列表
          ????x?=?table.row_values(i)
          ????if?x[1]?==?"0":
          ????????#?上行???站點(diǎn)數(shù)據(jù)??每條線路對(duì)應(yīng)有哪些站點(diǎn)?添加進(jìn)列表
          ????????site_dic[x[0]].append(x[3])
          ????????site_list.append(x[3])
          ????else:
          ????????continue
          #?print(len(site_dic))???#?618條線路
          #?print(len(site_list))??#?15248條站點(diǎn)數(shù)據(jù)
          print(f"公交網(wǎng)絡(luò)共有?{len(line_list)}?條線路")???#?618條線路

          #?先初始化一個(gè)統(tǒng)計(jì)每個(gè)節(jié)點(diǎn)的度的列表??與線路名稱列表里的索引一一對(duì)應(yīng)
          node_count?=?[m?*?0?for?m?in?range(len(line_list))]
          #?以每條線路為一個(gè)節(jié)點(diǎn)??線路名稱為鍵??????值為一個(gè)列表??里面包含每條路線上行經(jīng)過(guò)的所有站點(diǎn)
          sites?=?[site?for?site?in?site_dic.values()]
          #?print(sites)
          for?j?in?range(len(sites)):??#?類似冒泡法排序??比較多少趟
          ????for?k?in?range(j,?len(sites)?-?1):??#?每趟比較后??往后推一個(gè)??直到比較完??和防止越界
          ????????if?len(sites[j])?>?len(sites[k?+?1]):
          ????????????for?x?in?sites[j]:
          ????????????????if?x?in?sites[j]?and?x?in?sites[k?+?1]:???#?只要這兩條線路有公共站點(diǎn)??節(jié)點(diǎn)度數(shù)加1
          ????????????????????node_count[j],?node_count[k?+?1]?=?node_count[j]?+?1,?node_count[k?+?1]?+?1
          ????????????????????break???#?兩條線路對(duì)應(yīng)在列表索引的值加1???這兩條線的比較結(jié)束
          ????????else:
          ????????????for?x?in?sites[k?+?1]:
          ????????????????if?x?in?sites[j]?and?x?in?sites[k?+?1]:???#?只要這兩條線路有公共站點(diǎn)??節(jié)點(diǎn)度數(shù)加1
          ????????????????????node_count[j],?node_count[k?+?1]?=?node_count[j]?+?1,?node_count[k?+?1]?+?1
          ????????????????????break???#?兩條線路對(duì)應(yīng)在列表索引的值加1???這兩條線的比較結(jié)束
          #?print(node_count)
          #?節(jié)點(diǎn)編號(hào)?與?節(jié)點(diǎn)的度數(shù)索引對(duì)應(yīng)
          node_number?=?[y?for?y?in?range(len(node_count))]
          #?線性網(wǎng)絡(luò)度的最大值???175
          print(f"線路網(wǎng)絡(luò)的度的最大值為:{max(node_count)}")
          print(f"線路網(wǎng)絡(luò)的度的最小值為:{min(node_count)}")
          print(f"線路網(wǎng)絡(luò)的度的平均值為:{sum(node_count)?/?len(node_count)}")
          #?設(shè)置大小??圖的像素
          #?設(shè)置字體???matplotlib?不支持顯示中文??自己本地設(shè)置
          plt.figure(figsize=(10,?6),?dpi=150)
          mpl.rcParams['font.family']?=?'SimHei'

          #?繪制每個(gè)節(jié)點(diǎn)度的分布
          plt.bar(node_number,?node_count,?color="purple")

          #?添加描述信息
          plt.xlabel("節(jié)點(diǎn)編號(hào)n")
          plt.ylabel("節(jié)點(diǎn)的度數(shù)K")
          plt.title("線路網(wǎng)絡(luò)中各節(jié)點(diǎn)的度的大小分布",?fontsize=15)
          plt.savefig("線路網(wǎng)絡(luò)中各節(jié)點(diǎn)的度的大小.png")
          plt.show()
          結(jié)果如下:
          公交網(wǎng)絡(luò)共有?618?條線路
          線路網(wǎng)絡(luò)的度的最大值為:175
          線路網(wǎng)絡(luò)的度的最小值為:0
          線路網(wǎng)絡(luò)的度的平均值為:55.41423948220065
          import?xlrd
          import?matplotlib.pyplot?as?plt
          import?pandas?as?pd
          import?matplotlib?as?mpl
          import?collections

          df?=?pd.read_excel("site_information.xlsx")
          #?用pandas的操作去重???得到每條線路的名稱
          loc?=?df['線路名稱'].unique()
          #?得到每一條線路名稱的列表
          line_list?=?list(loc)
          print(line_list)

          #?打開(kāi)Excel表格
          data?=?xlrd.open_workbook("site_information.xlsx")
          #?print(data)???#??在內(nèi)存中
          #?獲取特定Sheet??索引為0??也就是第一個(gè)表
          table?=?data.sheets()[0]??#?從零開(kāi)始
          #?每條線路對(duì)應(yīng)有哪些站點(diǎn)??字典推導(dǎo)式
          site_dic?=?{k:?[]?for?k?in?line_list}
          site_list?=?[]
          for?i?in?range(1,?table.nrows):
          ????#?每一行的數(shù)據(jù)???返回的是一個(gè)列表
          ????x?=?table.row_values(i)
          ????if?x[1]?==?"0":
          ????????#?上行???站點(diǎn)數(shù)據(jù)??每條線路對(duì)應(yīng)有哪些站點(diǎn)?添加進(jìn)列表
          ????????site_dic[x[0]].append(x[3])
          ????????site_list.append(x[3])
          ????else:
          ????????continue
          #?print(len(site_dic))???#?618條線路
          #?print(len(site_list))??#?15248條站點(diǎn)數(shù)據(jù)
          #?先初始化一個(gè)統(tǒng)計(jì)每個(gè)節(jié)點(diǎn)的度的列表??與線路名稱列表里的索引一一對(duì)應(yīng)
          node_count?=?[m?*?0?for?m?in?range(len(line_list))]
          #?以每條線路為一個(gè)節(jié)點(diǎn)??線路名稱為鍵??????值為一個(gè)列表??里面包含每條路線上行經(jīng)過(guò)的所有站點(diǎn)
          sites?=?[site?for?site?in?site_dic.values()]
          #?print(sites)
          for?j?in?range(len(sites)):??#?類似冒泡法排序??比較多少趟
          ????for?k?in?range(j,?len(sites)?-?1):??#?每趟比較后??往后推一個(gè)??直到比較完??和防止越界
          ????????if?len(sites[j])?>?len(sites[k?+?1]):
          ????????????for?x?in?sites[j]:
          ????????????????if?x?in?sites[j]?and?x?in?sites[k?+?1]:???#?只要這兩條線路有公共站點(diǎn)??節(jié)點(diǎn)度數(shù)加1
          ????????????????????node_count[j],?node_count[k?+?1]?=?node_count[j]?+?1,?node_count[k?+?1]?+?1
          ????????????????????break???#?兩條線路對(duì)應(yīng)在列表索引的值加1???這兩條線的比較結(jié)束
          ????????else:
          ????????????for?x?in?sites[k?+?1]:
          ????????????????if?x?in?sites[j]?and?x?in?sites[k?+?1]:???#?只要這兩條線路有公共站點(diǎn)??節(jié)點(diǎn)度數(shù)加1
          ????????????????????node_count[j],?node_count[k?+?1]?=?node_count[j]?+?1,?node_count[k?+?1]?+?1
          ????????????????????break???#?兩條線路對(duì)應(yīng)在列表索引的值加1???這兩條線的比較結(jié)束
          #?print(node_count)
          #?節(jié)點(diǎn)編號(hào)?與?節(jié)點(diǎn)的度數(shù)索引對(duì)應(yīng)
          node_number?=?[y?for?y?in?range(len(node_count))]
          #?線性網(wǎng)絡(luò)度的最大值???175
          #?print(max(node_count))

          #?設(shè)置大小??圖的像素
          #?設(shè)置字體???matplotlib?不支持顯示中文??自己本地設(shè)置
          plt.figure(figsize=(10,?6),?dpi=150)
          mpl.rcParams['font.family']?=?'SimHei'

          #?分析節(jié)點(diǎn)的度K的概率分布
          #?統(tǒng)計(jì)節(jié)點(diǎn)的度為K的?分別有多少個(gè)
          node_count?=?collections.Counter(node_count)
          node_count?=?node_count.most_common()
          #?點(diǎn)
          node_dic?=?{_k:?_v?for?_k,?_v?in?node_count}
          #?按鍵從小到大排序???得到一個(gè)列表??節(jié)點(diǎn)的度
          sort_node?=?sorted(node_dic)
          #?按順序得到鍵對(duì)應(yīng)的值???即有相同節(jié)點(diǎn)的度的個(gè)數(shù)
          sort_num?=?[node_dic[q]?for?q?in?sort_node]
          #?概率分布中度平均值??總的度數(shù)加起來(lái)??/?個(gè)數(shù)
          #?print(sum(sort_node)/len(sort_node))
          #?概率分布中最大的度值???也就個(gè)數(shù)最多那個(gè)
          print(f"概率分布中概率最大的度值為:{max(sort_num)}")

          probability?=?[s1?/?sum(sort_num)?for?s1?in?sort_num]???#?概率分布
          print(probability)

          #?天津市公交線路節(jié)點(diǎn)概率分布圖像
          plt.bar(sort_node,?probability,?color="red")
          #?添加描述信息
          plt.xlabel("節(jié)點(diǎn)的度K")
          plt.ylabel("節(jié)點(diǎn)度為K的概率P(K)")
          plt.title("線路網(wǎng)絡(luò)中節(jié)點(diǎn)度的概率分布",?fontsize=15)

          plt.savefig("線路網(wǎng)絡(luò)中節(jié)點(diǎn)度的概率分布.png")
          plt.show()
          結(jié)果如下:
          概率分布中概率最大的度值為:16

          天津市公交線路網(wǎng)絡(luò)的度分布如上圖所示,本文收集的天津市線路網(wǎng)絡(luò)共有?618?條線路組成,線路網(wǎng)絡(luò)的度的最大值為175。概率分布中概率最大的度值為16,度平均值為55.41,表明天津市公交網(wǎng)絡(luò)提供的換乘機(jī)會(huì)較多,使得可達(dá)性較高。其中概率較大的度值大多集中在?7~26?之間,使得節(jié)點(diǎn)強(qiáng)度分布相對(duì)來(lái)說(shuō)不夠均勻,造成天津市很多路段公交線路較少,少數(shù)路段經(jīng)過(guò)線路過(guò)于密集,造成資源的浪費(fèi)。

          聚類系數(shù)是研究節(jié)點(diǎn)鄰居之間的連接緊密程度,因此不必考慮邊的方向。對(duì)于有向圖,將其當(dāng)成無(wú)向圖來(lái)處理。網(wǎng)絡(luò)聚類系數(shù)大,表明網(wǎng)絡(luò)中節(jié)點(diǎn)與其附近節(jié)點(diǎn)之間的連接緊密度程度高,即與實(shí)際站點(diǎn)之間的公交線路連接密集。計(jì)算得到天津公交復(fù)雜網(wǎng)絡(luò)的聚類系數(shù)為0.091,相對(duì)其他城市較低。

          根據(jù)公式:同規(guī)模的隨機(jī)網(wǎng)絡(luò)聚集系數(shù)約為0.00044,進(jìn)一步體現(xiàn)了網(wǎng)絡(luò)的小世界特性

          Python代碼如下:
          import?xlrd
          import?matplotlib.pyplot?as?plt
          import?pandas?as?pd
          import?matplotlib?as?mpl


          #?讀取數(shù)據(jù)
          df?=?pd.read_excel("site_information.xlsx")
          #?用pandas的操作去重???得到每條線路的名稱
          loc?=?df['線路名稱'].drop_duplicates()
          #?得到每一條線路名稱的列表??按照Excel表里以次下去的順序
          line_list?=?list(loc)
          #?print(line_list)

          #?打開(kāi)Excel表格
          data?=?xlrd.open_workbook("site_information.xlsx")
          #?print(data)???#??在內(nèi)存中
          #?獲取特定Sheet??索引為0??也就是第一個(gè)表
          table?=?data.sheets()[0]??#?從零開(kāi)始
          #?每條線路對(duì)應(yīng)有哪些站點(diǎn)??字典推導(dǎo)式
          site_dic?=?{k:?[]?for?k?in?line_list}
          site_list?=?[]
          for?i?in?range(1,?table.nrows):
          ????#?每一行的數(shù)據(jù)???返回的是一個(gè)列表
          ????x?=?table.row_values(i)
          ????if?x[1]?==?"0":
          ????????#?只取上行站點(diǎn)數(shù)據(jù)??每條線路對(duì)應(yīng)有哪些站點(diǎn)?添加進(jìn)列表
          ????????site_dic[x[0]].append(x[3])
          ????????site_list.append(x[3])
          ????else:
          ????????continue
          #?print(len(site_dic))???#?618條線路
          #?print(len(site_list))??#?15248條站點(diǎn)數(shù)據(jù)
          #?先初始化一個(gè)統(tǒng)計(jì)每個(gè)節(jié)點(diǎn)的度的列表??與線路名稱列表里的索引一一對(duì)應(yīng)
          node_count?=?[m?*?0?for?m?in?range(len(line_list))]
          #?以每條線路為一個(gè)節(jié)點(diǎn)??線路名稱為鍵??????值為一個(gè)列表??里面包含每條路線上行經(jīng)過(guò)的所有站點(diǎn)
          sites?=?[site?for?site?in?site_dic.values()]
          #?print(sites)
          #?統(tǒng)計(jì)各節(jié)點(diǎn)的度
          for?j?in?range(len(sites)?-?1):??#?類似冒泡法排序??比較多少趟
          ????for?k?in?range(j,?len(sites)?-?1):??#?每趟比較后??往后推一個(gè)??直到比較完??和防止越界
          ????????if?len(sites[j])?>?len(sites[k?+?1]):
          ????????????for?x?in?sites[j]:
          ????????????????if?x?in?sites[j]?and?x?in?sites[k?+?1]:???#?只要這兩條線路有公共站點(diǎn)??節(jié)點(diǎn)度數(shù)加1
          ????????????????????node_count[j],?node_count[k?+?1]?=?node_count[j]?+?1,?node_count[k?+?1]?+?1
          ????????????????????break???#?兩條線路對(duì)應(yīng)在列表索引的值加1???這兩條線的比較結(jié)束
          ????????else:
          ????????????for?x?in?sites[k?+?1]:
          ????????????????if?x?in?sites[j]?and?x?in?sites[k?+?1]:???#?只要這兩條線路有公共站點(diǎn)??節(jié)點(diǎn)度數(shù)加1
          ????????????????????node_count[j],?node_count[k?+?1]?=?node_count[j]?+?1,?node_count[k?+?1]?+?1
          ????????????????????break???#?兩條線路對(duì)應(yīng)在列表索引的值加1???這兩條線的比較結(jié)束

          #?找到該節(jié)點(diǎn)的鄰居節(jié)點(diǎn)??鄰居節(jié)點(diǎn)間實(shí)際的邊數(shù)
          Ei?=?[]
          #?對(duì)每條線路進(jìn)行找鄰接節(jié)點(diǎn)??并統(tǒng)計(jì)其鄰接節(jié)點(diǎn)點(diǎn)實(shí)際的邊數(shù)
          for?a?in?range(len(sites)):
          ????neighbor?=?[]
          ????if?node_count[a]?==?0:
          ????????Ei.append(0)
          ????????continue
          ????if?node_count[a]?==?1:
          ????????Ei.append(0)
          ????????continue
          ????for?b?in?range(len(sites)):
          ????????if?a?==?b:????#?自身??不比
          ????????????continue
          ????????if?len(sites[a])?>?len(sites[b]):???#?從站點(diǎn)多的線路里選取站點(diǎn)???看是否有公共站點(diǎn)
          ????????????for?x?in?sites[a]:
          ????????????????if?x?in?sites[a]?and?x?in?sites[b]:??#?找到鄰居節(jié)點(diǎn)
          ????????????????????neighbor.append(sites[b])
          ????????????????????break
          ????????else:
          ????????????for?x?in?sites[b]:
          ????????????????if?x?in?sites[a]?and?x?in?sites[b]:??#?找到鄰居節(jié)點(diǎn)
          ????????????????????neighbor.append(sites[b])
          ????????????????????break
          ????#?在鄰居節(jié)點(diǎn)中判斷這些節(jié)點(diǎn)的實(shí)際邊數(shù)??又類似前面的方法??判斷兩兩是否相連
          ????count?=?0
          ????for?c?in?range(len(neighbor)?-?1):
          ????????for?d?in?range(c,?len(neighbor)?-?1):??#?每趟比較后??往后推一個(gè)??直到比較完??和防止越界
          ????????????try:
          ????????????????if?len(sites[c])?>?len(sites[d?+?1]):
          ????????????????????for?y?in?sites[c]:
          ????????????????????????if?y?in?sites[c]?and?y?in?sites[d?+?1]:??#?鄰居節(jié)點(diǎn)這兩個(gè)也相連
          ????????????????????????????count?+=?1
          ????????????????????????????break
          ????????????????????????else:
          ????????????????????????????continue
          ????????????????else:
          ????????????????????for?y?in?sites[d?+?1]:
          ????????????????????????if?y?in?sites[c]?and?y?in?sites[d?+?1]:??#?鄰居節(jié)點(diǎn)這兩個(gè)也相連
          ????????????????????????????count?+=?1
          ????????????????????????????break
          ????????????????????????else:
          ????????????????????????????continue
          ????????????except?IndexError:
          ????????????????break
          ????Ei.append(count)

          #?每個(gè)節(jié)點(diǎn)的鄰居節(jié)點(diǎn)間實(shí)際相連的邊數(shù)
          #?print(Ei)
          #?節(jié)點(diǎn)編號(hào)?與?節(jié)點(diǎn)的度數(shù)索引對(duì)應(yīng)
          node_number?=?[y?for?y?in?range(len(node_count))]

          #?設(shè)置字體???matplotlib?不支持顯示中文??自己本地設(shè)置
          mpl.rcParams['font.family']?=?'SimHei'
          #?設(shè)置大小??圖的像素
          plt.figure(figsize=(10,?6),?dpi=150)
          #?公交線路網(wǎng)絡(luò)的聚類系數(shù)分布圖像???相鄰節(jié)點(diǎn)的連通程度
          Ci?=?[]
          for?m?in?range(len(node_number)):
          ????if?node_count[m]?==?0:
          ????????Ci.append(0)
          ????elif?node_count[m]?==?1:
          ????????Ci.append(0)

          ????else:??#?2?*?該節(jié)點(diǎn)鄰居節(jié)點(diǎn)實(shí)際連接邊數(shù)?/?最大邊數(shù)
          ????????Ci.append(2?*?Ei[m]?/?(node_count[m]?*?(node_count[m]?-?1)))

          #?各節(jié)點(diǎn)鄰居節(jié)點(diǎn)的連通程度?計(jì)算平均聚類系數(shù)
          print("天津市公交線路網(wǎng)絡(luò)平均聚類系數(shù)為:{:.4f}".format(sum(Ci)?/?len(Ci)))
          plt.bar(node_number,?Ci,?color="blue")

          #?添加描述信息
          plt.xlabel("節(jié)點(diǎn)編號(hào)n")
          plt.ylabel("節(jié)點(diǎn)的聚類系數(shù)")
          plt.title("線路網(wǎng)絡(luò)中各節(jié)點(diǎn)的聚類系數(shù)分布",?fontsize=15)

          plt.savefig("聚類系數(shù)分布.png")
          plt.show()
          結(jié)果如下:
          天津市公交線路網(wǎng)絡(luò)平均聚類系數(shù)為:0.0906

          更多閱讀



          2020 年最佳流行 Python 庫(kù) Top 10


          2020 Python中文社區(qū)熱門文章 Top 10


          5分鐘快速掌握 Python 定時(shí)任務(wù)框架

          特別推薦




          點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員

          瀏覽 77
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久艹视频| 日本丰满少妇黄大片在线观看 | 东京热AV无码国产东京热AⅤ | 日本一 级 黄 色 视频 | 香蕉婷婷 |