科研04——python如何利用列表的数据画图

  • 放一个代码,以后方便
  • 关于从csv文件中导出数据来画图
  • 画点图
  • 画柱状图


放一个代码,以后方便

import matplotlib.pyplot as plt

def draw_number(step, number_V2V, number_V2I, number_finished, number_number_all_taskd):
    plt.rcParams['font.sans-serif'] = ['SimHei']#用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False#用来正常显示负号
    
#    plt.bar(step,cost, color="red")
#    plt.plot(step,cost)
    plt.plot(step, number_finished, color = "red", label = "已经完成的任务个数")
    plt.plot(step, number_V2V, color = "blue", label = "offload给车的任务个数")
    plt.plot(step, number_V2I, color = "green", label = "offload给MEC的任务个数")
    plt.plot(step, number_number_all_taskd, color = "orange", label = "总任务个数")
    
    plt.legend()#显示图例
    plt.xlabel("step")
    plt.ylabel("task_number")
    plt.title("随着时间变化的相应的任务个数")
    plt.show()#画图

draw_number(stepd, number_V2Vd, number_V2Id, number_finishedd, number_number_all_taskd)

输出结果:

PyNomo 列线图python python用列表数据画图_柱状图


通过上面的输出结果和代码对应着看,很容易理解

关于从csv文件中导出数据来画图

其实无论是画柱状图还是点图,自变量和因变量都应该是一个一维列表,这个要非常明确

但是,如果是从csv文献中读数据来画图,实践中会发现是有一点区别的

画点图

画点图其实和普通的列表画图没什么区别,读出来对应的列,如上一篇文章科研03——python如何对csv文件进行读写操作,读出来address0address1,分别作为自变量和因变量draw_delay(address0, address1),就可以正确的画出来点图了

画柱状图

画柱状图却有很大的区别,如果我只是在函数中把点图改成柱状图,函数调用的时候仍然是draw_delay(address0, address2)的话,那就会报错TypeError: only size-1 arrays can be converted to Python scalars,这个错误的意思是你这个维度太大了,其实是很好理解的,因为你print(address2)会发现结果为:

print(address2)

#输出结果
 		  2
0  4.000000
1  3.130000
2  2.646667
3  2.260000
4  2.144000

你会发现这肯定不是一个一维数组
而且,通过print(type(address2)),你会发现address2的类型为dataframe,并非是array,这样的话就会出问题

print(type(address2))

#输出结果
<class 'pandas.core.frame.DataFrame'>

这个时候应该使用address0.values,这样子就把这里面的值提取出来了,发现是个二维数组,但是每一行只有一个元素

print(address0.values)

#输出结果
[[1]
 [2]
 [3]
 [4]
 [5]]

这时候如果看address0.values的类型,会发现不一样的,这下就变成熟悉的array类型

a = address0.values
print(type(a))

#输出结果
<class 'numpy.ndarray'>

这个时候需要把二维数组转化为一维数组,这是个numpy中很熟悉的操作了,即用flatten方法,如下

print(a.flatten())

#输出结果
[1 2 3 4 5]

这样就转变为一维数组了,可以作为画图时输入的标准格式

因此,最后画柱状图时,总结调用函数的方法,要加后缀来转化

draw_energy(address0.values.flatten(), address1.values.flatten())    
draw_delay(address0.values.flatten(), address2.values.flatten())