最近老板让我们画图,然后网上的教程实在是有点简单。很多高标准的操作都没有方法,于是自己写一篇教程。 iii.run
pylab(使用工具)
pylab將許多常用的module集中到統一的namespace,目標是提供一個類matlab的工作環境,使用者無需自行import所需功能。不過import explicitly是編程的好習慣,讓命名空間乾淨些,如無必要應避免使用pylab。(pyplot是matplotlib的繪圖界面)
其实也就是 matplotlib.pyplot
画图
- 引入库,设置画布大小
from pylab import *
plt.figure(figsize=(10, 7))
如果不用pylab包的话,我们需要单独引入如下三个包
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
效果是一样的
- 读取数据
这里我写了一个简单的文件读取函数,用到numpy来自动分割
#读取文件部分
def readfile(filename):
filename = 'data\\' + filename
content = np.loadtxt(filename)
return content
a = readfile('1.txt')
b = readfile('2.txt')
c = readfile('3.txt')
d = readfile('4')
influence = [x[4] for x in a]
influence1 = [x[4] for x in b]
influence2 = [x[4] for x in c]
influence3 = [x[7] for x in d]
用np.loadtxt
读取数据的好处是,可以自动将数据分割。
画图部分
- 设置一些宏观的东西
plt.xticks(fontsize=25) # x轴坐标标签字体大小
plt.yticks(fontsize=30)# y轴坐标标签字体大小
plt.ylim(0, 4000) # y轴坐标范围
plt.yticks([0, 2000, 4000])#设置标签
plt.xlabel('(B,|Q|)', fontsize=30)
plt.ylabel('InfluenceSpread', fontsize=30)
bar_width = 0.2#柱子宽度
plt.subplots_adjust(left=0.16, right = 0.97,wspace=0.2, hspace=0.2, bottom=0.14, top=0.90)#调整图像的位置
- 塞数据
x_pos = np.arange(len(a))
plt.bar(left=x_pos, height=influence3, width=bar_width, color='#ED1C24', label="x_pos", ec='white', align="center")
P_pos = np.arange(3)
P_pos = [i+bar_width for i in PICS_pos]
plt.bar(left=P_pos, height=influence, width=bar_width, color='#1F77B4', label="P", ec='white', align="center")
B_1 = [i+2*bar_width for i in x_pos]
plt.bar(left=B_pos, height=influence1, width=bar_width, color='#FF7F0E', label="B_1", ec='white', align="center")
B_2 = [i+3*bar_width for i in x_pos]
plt.bar(left=BESO2x_pos, height=influence2, width=bar_width, color='#2CA02C', label="B_2", ec='white', align="center")
- 加底部横坐标标签
BESO2x = ['(5,5)','(10,10)','(20,20)','(30,30)','(40,40)','(50,50)']
x_final_pos = [i-1.5*bar_width for i in BESO2x_pos] #调节横坐标轴的位置
plt.xticks(x_final_pos, BESO2x, )
运行一下看看
到目前位置,代码这么多
from pylab import *
plt.figure(figsize=(10, 7))
########################################################################
#读取文件部分
def readfile(filename):
filename = 'data\\' + filename
content = np.loadtxt(filename)
return content
a = readfile('1.txt')
b = readfile('2.txt')
c = readfile('3.txt')
d = readfile('4')
influence = [x[4] for x in a]
influence1 = [x[4] for x in b]
influence2 = [x[4] for x in c]
influence3 = [x[7] for x in d]
###############################################################################
#设置一些宏观的东西
plt.xticks(fontsize=25)
plt.yticks(fontsize=30)
plt.ylim(0, 4000)
plt.yticks([0, 2000, 4000])
plt.xlabel('(B,|Q|)', fontsize=30)
plt.ylabel('InfluenceSpread', fontsize=30)
bar_width = 0.2
plt.subplots_adjust(left=0.16, right = 0.97,wspace=0.2, hspace=0.2, bottom=0.14, top=0.90)
###############################################################################
#画图部分
x_pos = np.arange(len(a))
plt.bar(left=x_pos, height=influence3, width=bar_width, color='#ED1C24', label="x_pos", ec='white', align="center")
P_pos = np.arange(3)
P_pos = [i+bar_width for i in PICS_pos]
plt.bar(left=P_pos, height=influence, width=bar_width, color='#1F77B4', label="P", ec='white', align="center")
B_1 = [i+2*bar_width for i in x_pos]
plt.bar(left=B_pos, height=influence1, width=bar_width, color='#FF7F0E', label="B_1", ec='white', align="center")
B_2 = [i+3*bar_width for i in x_pos]
plt.bar(left=BESO2x_pos, height=influence2, width=bar_width, color='#2CA02C', label="B_2", ec='white', align="center")
###############################################################################
#数据保存+展示
plt.legend(loc='upper left', fontsize=20)
plt.show()
###############################################################################
大概效果已经出来了,那么继续优化一下
优化篇
- 使用Python画图并设置科学计数法
ax = plt.gca() #获取当前图像的坐标轴信息
xfmt = ScalarFormatter(useMathText=True)
xfmt.set_powerlimits((0, 0)) # Or whatever your limits are . . .
gca().yaxis.set_major_formatter(xfmt)
嗯,效果还可以,就是这个左上角的标志太小了。
这个地方怎么调整一下,想到所有标志都有大小,所以我们只需要添加一个默认值即可。
- 左上角科学计数法标签大小设置
matplotlib.rcParams.update({'font.size': 30, 'font.family': 'serif'})#设置左上角标签大小
- 最后代码
from pylab import *
plt.figure(figsize=(10, 7))
matplotlib.rcParams.update({'font.size': 30, 'font.family': 'serif'})#设置左上角标签大小
##################纵坐标设置为科学计数法#######################################
ax = plt.gca() #获取当前图像的坐标轴信息
xfmt = ScalarFormatter(useMathText=True)
xfmt.set_powerlimits((0, 0)) # Or whatever your limits are . . .
gca().yaxis.set_major_formatter(xfmt)
########################################################################
#读取文件部分
def readfile(filename):
filename = 'E:\\123\\' + filename
content = np.loadtxt(filename)
return content
a = readfile('a.txt')
b = readfile('b.txt')
c = readfile('c.txt')
d = readfile('d')
influence = [x[4] for x in a]
influence1 = [x[4] for x in b]
influence2 = [x[4] for x in c]
influence3 = [x[7] for x in d]
###############################################################################
#设置一些宏观的东西
plt.xticks(fontsize=25)
plt.yticks(fontsize=30)
plt.ylim(0, 4000)
plt.yticks([0, 2000, 4000])
plt.xlabel('ABC', fontsize=30)
plt.ylabel('Speed', fontsize=30)
bar_width = 0.2
plt.subplots_adjust(left=0.16, right = 0.97,wspace=0.2, hspace=0.2, bottom=0.14, top=0.90)
###############################################################################
#画图部分
x_pos = np.arange(len(d))
plt.bar(left=x_pos, height=influence3, width=bar_width, color='#ED1C24', label="d", ec='white', align="center")
PICS_pos = np.arange(3)
PICS_pos = [i+bar_width for i in PICS_pos]
plt.bar(left=PICS_pos, height=influence, width=bar_width, color='#1F77B4', label="a", ec='white', align="center")
BESO1x_pos = [i+2*bar_width for i in x_pos]
plt.bar(left=BESO1x_pos, height=influence1, width=bar_width, color='#FF7F0E', label="b", ec='white', align="center")
BESO2x_pos = [i+3*bar_width for i in x_pos]
plt.bar(left=BESO2x_pos, height=influence2, width=bar_width, color='#2CA02C', label="c", ec='white', align="center")
BESO2x = ['1','2','3','4','10','100']
x_final_pos = [i-1.5*bar_width for i in BESO2x_pos]
plt.xticks(x_final_pos, BESO2x, )
###############################################################################
#数据保存+展示
plt.legend(loc='upper left', fontsize=20)
plt.show()
###############################################################################
-
左右间距觉得不合适?
在这里可以自己调节
python画折线图
折线图要比柱状图容易很多
from pylab import *
plt.figure(figsize=(10, 7))
##################纵坐标设置为科学计数法#######################################
ax = plt.gca() #获取当前图像的坐标轴信息
xfmt = ScalarFormatter(useMathText=True)
xfmt.set_powerlimits((0, 0)) # Or whatever your limits are . . .
gca().yaxis.set_major_formatter(xfmt)
########################################################################
#读取文件部分
def readfile(filename):
filename = 'E:\\123\\' + filename
content = np.loadtxt(filename)
return content
a = readfile('a.txt')
b = readfile('b.txt')
c = readfile('c.txt')
d = readfile('d')
influence = [x[4] for x in a]
influence1 = [x[4] for x in b]
influence2 = [x[4] for x in c]
influence3 = [x[7] for x in d]
###############################################################################
#设置一些宏观的东西
plt.xticks(fontsize=25)
plt.yticks(fontsize=30)
plt.ylim(0, 4000)
plt.yticks([0, 2000, 4000])
plt.xlabel('ABC', fontsize=30)
plt.ylabel('Speed', fontsize=30)
bar_width = 0.2
plt.subplots_adjust(left=0.16, right = 0.97,wspace=0.2, hspace=0.2, bottom=0.14, top=0.90)
###############################################################################
#画图部分
x_pos = np.arange(len(d))
plt.plot(x_pos, influence3, color='#ED1C24', marker='s', linewidth=5, markersize=30, label="d")
pos = np.arange(3)
plt.plot(pos, influence, color='#1F77B4', marker='^', linewidth=5, markersize=30, label="a")
plt.plot(x_pos, influence1, color='#FF7F0E', marker='d', linewidth=5, markersize=30, label="b")
plt.plot(x_pos, influence2, color='#2CA02C', marker='o', linewidth=5, markersize=30, label="c")
stick = ['1','2','3','4','10','100']
plt.xticks(x_pos, stick, )
###############################################################################
#数据保存+展示
plt.legend(loc='upper left', fontsize=20)
plt.show()
###############################################################################