<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進(jìn)行城市公交網(wǎng)絡(luò)分析與可視化

          共 25375字,需瀏覽 51分鐘

           ·

          2021-03-03 09:22

          點(diǎn)擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書

          寒雨連江夜入?yún)牵矫魉涂统焦隆?/span>

          一、數(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=(126), 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.2039.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)   # <xlrd.book.Book object at 0x000001F1111C38D0> 在內(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=(106), 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)   # <xlrd.book.Book object at 0x000001F1111C38D0> 在內(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=(106), 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)   # <xlrd.book.Book object at 0x000001F1111C38D0> 在內(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=(106), 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

          參考論文:

          基于天津市公共交通網(wǎng)絡(luò)的復(fù)雜性研究

          基于復(fù)雜網(wǎng)絡(luò)的城市公交網(wǎng)絡(luò)拓?fù)涮卣骷熬€路連通性分析

          ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說(shuō)一兩句吧~

          瀏覽 70
          點(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>
                  91色色图片 | jizz在线观看视频 | 91AV精品久久 | 伊人久久久久亚洲AV无码裤子 | 久久午夜无码鲁丝片 |