编辑推荐: |
本文来源csdn,本文主要通过各种8种图详细介绍了matplotlib数据加载可视化,希望对您的学习有所帮助。 |
|
一、柱状图详解
import
matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"]=['SimHei']
# 用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
#再论柱状图
#创建一个画板
plt.figure(1)
# 确定绘图范围,由于只需要画一张图,所以我们将整张白纸作为绘图的范围
# 111: 表示设置绘图范围为1行1列,最后一个1代输出到第1块画布上目前只有1块)
ax1=plt.subplot(111)
#数据准备
#y轴数据
data = np.array([15,10,25,15])
width=0.5#柱状图宽度
#x轴数据
x_bar = np.arange(4)
rect=ax1.bar(x_bar,data,width=width,color="lightblue")
#为柱状图添加高度值
for rec in rect:
x=rec.get_x() #获取所有x坐标的值
height=rec.get_height() #获取所在高度的值
print(x,height)
ax1.text(x+0.2,1.02*height,str(height)+'W')
#在指定位置写上高度的值
#设置x的坐标
ax1.set_xticks(x_bar)
ax1.set_xticklabels(["第一季度","第二季度","第三季度","第四季度"])
ax1.set_xlabel("季度")
#设置Y的标签
ax1.set_ylabel("销量(单位:万件)")
ax1.set_title("2017年季度销售量统计")
ax1.grid(True) #是否显示网格
ax1.set_ylim(0,28) #设置y的显示范围ax1.spines["right"].set_color("none")
ax1.spines["top"].set_color("none")
|
二、#绘制多幅图形subplot
import
matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"]=['SimHei']
# 用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
plt.figure(figsize=(6,6),dpi=80) #创建画布 ,dpi每个单位的像素
plt.figure(1) # 创建第一个画板(figure)
ax1=plt.subplot(211) # 划分画板为2 行 1 列,共 2 块区域,并获取当前画板的第一个子图(子块)
plt.scatter([1, 2, 3],[2,4,7],marker="v",s=20)
# 绘图
ax2 = plt.subplot(212) # 获取当前画板的第二个子图(子块)
ax2.set_ylim(0,6) #设置y的显示范围
plt.plot([4, 5, 6]) # 绘图
#创建第二个画板,来画图
plt.figure(2)
x=np.arange(4)
y=np.array([12,13,15,10])
#绘制柱状图
ax3=plt.bar(x,y)
plt.title("第二个画板")
plt.figure(1) #切换到第一个画板
plt.subplot(211) #切换到第一块区域subplot(211)
ax1.set_title('第一个画板(区域1)') # 做出211的标题
plt.subplot(212) #切换到第一块区域subplot(211)
ax2.set_title('第一个画板(区域2)') # 做出212的标题
# 调整每隔子图之间的距离
plt.tight_layout()
plt.show()
|
三、加载数据
3.1、从文件中加载数据
import
matplotlib.pyplot as plt
import numpy as np
# import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
#11111111111111111111加载csv文件
#定义两个空列表,存放x,y轴数据
x = []
y = []
with open('csv/matplotlib-demo.csv','r') as
csvfile:
plots = csv.reader(csvfile, delimiter=',')
for row in plots:
x.append(int(row[0]))
y.append(int(row[1]))
plt.plot(x,y, label='模拟数据')
plt.xlabel('x')
plt.ylabel('y')
plt.title('演示从文件加载数据')
plt.legend()
plt.show()
|
3.2、从网页中加载数据
mport
json #解析数据
import urllib
url = "https://api.douban.com/v2/book/1220562"
data = urllib.request.urlopen(url).read().decode()
data
#用josn将字符串数据转化为python字典
formatData = json.loads(data)
formatData
#获取字典中key值为tags对应的数据
tags=formatData["tags"]
#用来存放的两个列表
X=[]
Y=[]
#遍历数据,取count作为y轴数据,name作为x轴
for tag in tags:
print("{}----{}".format(tag["name"],tag["count"]))
X.append(tag["name"])
Y.append(tag["count"])
#绘制柱状图
plt.bar(X,Y,label="图书热搜词")
plt.title("'图书热词搜索排名")
plt.xlabel('x轴-搜索热词')
plt.ylabel('y轴-搜索热词排名')
plt.legend()
|
#用numpy加载csv数据
x,y =np.loadtxt("csv/matplotlib-demo.csv",delimiter=",",unpack=True)
plt.plot(x,y,label="numpy加载数据")
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.title("'numpy加载数据过程")
plt.legend()
|
四、Pandas+Matplotlib简化数据可视化
4.1、Series/DataFrame.plot()方法
import
matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
from pandas import Series,DataFrame
#111111111111111111111111111111111111111111111Series绘图原理
#指定S的索引
s = pd.Series(np.random.randn(10).cumsum(),#累加
index=np.arange(0,100,10))
#指定索引
index = np.arange(5)
ax=s.plot(label = "累加折线图",title =
"随机累加折线图")
ax.legend()
# ax.plot(title = "随机累加折线图")
#Series+!+!+!+!+!++!++!+!+!+!+!+!指定S的索引
s = pd.Series(np.random.randn(10).cumsum(),#累加
index=np.arange(0,100,10))
#指定索引
index = np.arange(5)
ax=s.plot(label = "累加折线图",title =
"随机累加折线图",style="ko-")
ax.legend()
# ax.plot(title = "随机累加折线图")
|
#22222222222222222222222222222222222222DataFrame绘图原理
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
from pandas import Series,DataFrame
df=DataFrame(np.random.randn(10,6),index = np.arange(0,100,10),columns=list("ABCDEF"))
df.plot()
|
#将Dataframe中各列的数据分配到不同的子图中,是否共用x,y轴
df.plot(subplots=True,sharey=False)
|
4.2、参数详解
4.3、绘制多区域柱状图
import
matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
from pandas import Series,DataFrame
#创建画板,获取Axes对象
fig, axes = plt.subplots(2,1)#创建两行一列的画板
data = pd.Series(np.random.randn(16),#创建绘图数据
index=list('abcdefghijklmnop'))
data.plot(kind='bar',
ax=axes[0], color='k',alpha=0.7) #在第一块画板
data.plot(kind='barh',
ax=axes[1], color='k',alpha=0.7) #在第二块画板
plt.show()
'''
alpha=0.7 宽度
'''
|
4.4、绘制直方图
import
matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
from pandas import Series,DataFrame
#读取pandas中的excel文件
df = pd.read_excel("excel/pandas-matplotlib.xlsx","Sheet1")
fig = plt.figure()
#创建画布大小
fig.set_size_inches(10,8)
#在画板上指定ax的绘图板块
ax = fig.add_subplot(111)
#画直方图
ax.hist(df['Age'], bins=7) #平均分布成七段
plt.title('年龄分布')
plt.xlabel('Age')
plt.ylabel('人数')
plt.legend()
|
4.5、箱型图
fig2
= plt.figure()
ax=fig2.add_subplot(111)
ax.boxplot(df.Age)
plt.show() |
4.6、条形图
#
条形图
var = df.groupby('Gender').Sales.sum()
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_xlabel("性别")
ax1.set_ylabel("人数")
ax1.set_title("人数区分")
var.plot(kind="bar")
|
4.7、堆叠图
#堆叠图
var2=df.groupby(['BMI','Gender']).Sales.sum().unstack()
var2.plot(kind="bar",stacked=True,
#是否堆叠
color = ['y','b']) |
4.8、散点图
fig
= plt.figure()
ax = fig.add_subplot(111)
ax.scatter(df['Age'], df['Sales'],s=100)
plt.show() |
4.9、气泡图
fig
= plt.figure()
ax = fig.add_subplot(111)
ax.scatter(df['Age'], df['Sales'], s=df['Income'])
# 第三个变量表明根据收入气泡的大小
plt.show() |
4.10、饼图
#饼图
temp = df.groupby(['Gender']).sum()
#单独取出
x_list = temp['Sales']
label_list = temp.index
plt.axis('equal') #x与y轴是否相等,,(相当于是否是圆还是椭圆)
plt.pie(x_list, labels=label_list,shadow=True,#是否有阴影
startangle=90,autopct='%1.1f%%',
explode=[0,0.1])
plt.title('expense')
plt.show()
'''
plt.axis('equal') #x与y轴是否相等,,(相当于是否是圆还是椭圆
shadow=True, #是否有阴影
autopct='%1.1f%% #显示百分比数据
explode=[0,0.1] #需要偏移的数据和大小
startangle=90 #从90度的位置开始画
'''
|
|