这也是我第一次用Python来画图,用了matplotlib包,选了简单的饼图和柱状图来画。主要工作在画图前的数据处理上,把并不规则的数据排序并抽取画图需要的数据,代码如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
def takeFirst(elem):
    return elem[0]

matplotlib.rcParams['font.sans-serif'] = [u'SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

dataz = pd.read_csv('./data_processed.csv')#使用pandas包读取csv数据
data=dataz.loc[:,['ave_length','layers_count']].values.tolist()#选取需要的列并转换为列表
data1=dataz.loc[:,['ave_length','name']].values.tolist()#选取需要的列并转换为列表
#axis=0代表取每一列的最大或最小值,返回是数组
ave_length_max=int(np.max(data, axis=0)[0])
layars_cnt_max=int(np.max(data, axis=0)[1])
ave_length_min=int(np.min(data, axis=0)[0])
layars_cnt_min=int(np.min(data, axis=0)[1])

data_g_=[0 for n in range(0,layars_cnt_max+1)]
labels_g_1=[]
data_g_1=[]
protocol_type_number=len(data)

for protocol_ in data:
    data_g_[int(protocol_[1])]=data_g_[int(protocol_[1])]+1
print(data_g_)

for index,cnt in enumerate(data_g_):
    if cnt != 0:
        data_g_1.append(cnt)
        labels_g_1.append(index)
#饼图  
colors = ['red','pink','magenta','purple','orange','yellow','blue','chocolate','coral','darkgoldenrod','greenyellow','indigo','lightyellow','olive']
plt.axes(aspect='equal')
plt.xlim(0,18)
plt.ylim(0,18)
plt.gca().spines['right'].set_color('none')
plt.gca().spines['top'].set_color('none')
plt.gca().spines['left'].set_color('none')
plt.gca().spines['bottom'].set_color('none')
plt.pie(x=data_g_1, #绘制数据
labels=labels_g_1,#添加标签
#突出显示Pythonexplode=explode
colors=colors, #设置自定义填充色
labeldistance=None,#设置标签和圆心的距离
startangle=180,#设置饼图的初始角度
center=(5,9),#设置饼图的圆心(相当于X轴和Y轴的范围)
radius=8,#设置饼图的半径(相当于X轴和Y轴的范围)
counterclock= False,#是否为逆时针方向,False表示顺时针方向
wedgeprops= {'linewidth':1,'edgecolor':'green'},#设置饼图内外边界的属性值
textprops= {'fontsize':16,'color':'black'},#设置文本标签的属性值
frame=1) #是否显示饼图的圆圈,1为显示
plt.xticks(())
plt.yticks(())
plt.title('协议层数饼图',fontsize=25)
plt.legend(loc='center right') 
plt.show()



#柱状图
data1.sort(key=takeFirst)#定义排序准则
data_g_2_1=data1[-6:-1]
print(data_g_2_1)
data_g_2_2=data1[0:5]
print(data_g_2_2)
data_g_2_3=data1[int((len(data1)-2)/2):int((len(data1)+3)/2)]
print(data_g_2_3)
data_g_2=data_g_2_2+data_g_2_3+data_g_2_1
print(data_g_2)
# 包含每个柱子下标的序列
index = np.arange(len(data_g_2))
# 柱子的宽度
width = 0.45
# 绘制柱状图, 每根柱子的颜色为紫罗兰色
p2 = plt.bar(index, [val_[0] for val_ in data_g_2], width, label="ave_length", color="#87CEFA")
# 设置横轴标签
# 设置纵轴标签
plt.xlabel('name of protocol')
plt.ylabel('ave_length')
# 添加标题
plt.title('协议的平均长度')
# 添加纵横轴的刻度
plt.xticks(index, [val_[1] for val_ in data_g_2])
# plt.yticks(np.arange(0, 10000, 10))
# 添加图例
plt.legend(loc="upper right")
plt.show()
说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...