概述
一,基本图标的绘制
图标类型:线形图,柱状图,密度图,以横坐标两个维度为主
同时可以延伸出多种其他图标样式
plt.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None, legend=False,
style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None,
rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None, label=None, secondary_y=False, **kwds)
1.1,Series直接生成图标
# Series 直接生成图标
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
ts.plot(
kind='line',
label='haha',
style='--g',
color='r',
alpha=0.4,
use_index=True,
rot=45,
grid = True,
ylim=[-50, 50],
yticks=list(range(-50, 50, 10)),
figsize=(8, 4),
title='test',
legend=True
)
plt.grid(True, linestyle='--', color='#eeeeee', linewidth='0.5', axis='x')
# Series.plot():Series的index为横坐标,values为纵坐标
# kind --> line, bar, barth...(折线图, 柱状图, 柱状图-横)
# label --> 图例标签,DataFrame格式以columns为label
# style --> 符合样式,包含线样式,点样式,线颜色
# color --> 颜色,有color的指定的时候,以color颜色为准
# alpha --> 透明度,0~1
# use_index --> 将索引引用为x轴刻度标签,默认为True
# rot --> 旋转标签刻度,0~360度
# grid --> True为显示网格,一般都用plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'x')
# xlim, ylim --> t,y轴界限
# xticks, yticks --> x, y轴刻度值
# figsize --> 图像大小
# title --> 图标名称
# legend --> 是否显示图例,一般直接用plt.legend(loc='lower center')
1.2,DataFrame直接生成图标
# DataFrame 直接生成图标
df = pd.DataFrame(np.random.randn(1000, 4), ts.index, columns=list('ABCD'))
df = df.cumsum()
df.plot(
kind='line',
style='--g',
use_index=True,
rot=45,
grid=True,
figsize=(8, 4),
title='text',
legend=True,
subplots=False,
colormap='Greens'
)
# subplots --> 是否将各个列绘制成不同的图标,默认False
# 也可以 --> plt.plot(df)来画图
二,柱状图,堆叠图
plt.plot(kind='bar/barh') , plt.bar() # 两种画法
2.1,柱状图与堆叠图
fig, axes = plt.subplots(4, 1, figsize=(10, 10))
s = pd.Series(np.random.randint(0, 10, 16), index=list('abcdefghijklmnop'))
df = pd.DataFrame(np.random.rand(10, 3), columns=list('abc'))
s.plot(kind='bar', color='r', grid=True, alpha=0.5, ax=axes[0], rot=45)
# Series柱状图方:Series.plot(kind='bar'/'barh')有h代表x,y轴反转
df.plot(kind='bar', ax=axes[1], grid=True)
# DataFrame柱状图:DataFrame.plot(kind='bar'/'barh'')
df.plot(kind='bar', ax=axes[2], grid=True, colormap='Reds_r', stacked=True)
# DataFrame柱状堆叠图:通过stacked把数据堆叠在一起
df.plot.barh(ax=axes[3], grid=True, stacked=True, colormap='YlOrRd_r')
# 新版本写法,barh使x,y轴反转,stacked堆叠数据
2.2,柱状图补充
plt.figure(figsize=(10, 6))
x = np.arange(10)
y1 = np.random.rand(10)
y2 = -np.random.rand(10)
plt.bar(x, y1, width=1, facecolor='yellowgreen', edgecolor='white', yerr =y1*0.1)
plt.bar(x, y2, width=1, facecolor='lightskyblue', edgecolor='white', yerr=y2*0.1)
# x, y参数,x,y值
# width:宽度比例
# facecolor:柱子的颜色, edgecolor外边框的颜色
# yerr:基准线,后面的的值代表基准线长度
for i, j in zip(x, y1):
plt.text(i-0.3, j+0.1, "{:.2f}".format(j), color='red', alpha=0.5)
for i, j in zip(x, y2):
plt.text(i-0.3, j-0.15, "{:.2f}".format(j), color='red', alpha=0.5)
# 用遍历的方法添加text,简直6到不行
# zip的方法吧两个等长的容器里面的值一一匹配,返回一个嵌套元组
2.3,外嵌图标
# 外嵌图表plt.table()
# table(cellText=None, cellColours=None,cellLoc='right', colWidths=None,rowLabels=None, rowColours=None, rowLoc='left',
# colLabels=None, colColours=None, colLoc='center',loc='bottom', bbox=None)
data = [[ 66386, 174296, 75131, 577908, 32015],
[ 58230, 381139, 78045, 99308, 160454],
[ 89135, 80552, 152558, 497981, 603535],
[ 78415, 81858, 150656, 193263, 69638],
[139361, 331509, 343164, 781380, 52269]]
columns = ('Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
index = ['{} year'.format(x) for x in [5, 10, 20, 50, 100]]
df = pd.DataFrame(data, index=index, columns=columns)
fig = df.plot(kind='bar', stacked=True, colormap='Blues_r', figsize=(10, 6))
# 创建叠堆图
fig.table(cellText = data,
cellLoc='left',
cellColours = None,
rowLabels = index,
rowColours = plt.cm.BuPu(np.linspace(0, 0.5,5))[::-1], # BuPu可替换成其他colormap
colLabels = columns,
colColours = plt.cm.Reds(np.linspace(0, 0.5,5))[::-1],
rowLoc='left',
loc='bottom')
# cellText:表格文本
# cellLoc:cell内文本对齐方式
# rowLabels:相当于index
# colLabels:想当于columns
# rowLoc:index对齐位置
# loc:这table的方位
fig.set_xticklabels([])
# 不显示x轴的刻度标签
三,面积图、填图、饼图
3.1,面积图
fig, axes = plt.subplots(2, 1, figsize=(8, 6))
df1 = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd'))
df2 = pd.DataFrame(np.random.randn(10, 4), columns=list('abcd'))
df1.plot(kind='area', colormap='Greens_r',ax=axes[0], alpha=0.8)
df2.plot(kind='area', colormap='copper', ax=axes[1], alpha=0.8, stacked=False)
# df1.plot.area(colormap='Greens_r',ax=axes[0], alpha=0.8)
# 使用Series.plot.area()和DataFrame.plot.area()创建面积图
# 为了产生堆叠面积图,每列必须是正值或者负值,否则报错(就必须取消堆叠堆叠,或者使用填图)
# 当数据有NaN的时候,会自动填充成0,所以数据需要清洗掉缺失值
3.2,填图
fig,axes = plt.subplots(3,1,figsize = (8,6))
x = np.linspace(0, 1, 500)
y1 = np.sin(4*np.pi*x) * np.exp(-5*x)
y2 = -y1
axes[0].fill(x, y1, 'r', label='y1')
axes[0].fill(x, y2, 'b', label='y1')
# 对函数和坐标轴之间的区域进行填充,使用fill函数(不需要正负值)
# 也可以写成:plt.fill(x, y, ....)
x = np.linspace(0, 5 * np.pi, 1000)
y1 = np.sin(x)
y2 = np.sin(2 * x)
y3 = 0.5 以0.5作为基准线填充
axes[1].fill_between(x, y1, y2, color='b', label='area')
axes[2].fill_between(x, y1, y3, color='b', label='area')
# 填充两个函数之间的区域,使用fill_between函数
for i in range(2):
axes[i].legend()
# axes[i].grid()
# 使用for循环给子图添加图例,网格
3.3,饼图
'''参数
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, hold=None, data=None)
'''
s = pd.Series(3*np.random.rand(4), index=list('abcd'), name='Series')
plt.axis('equal')
s.plot(kind='pie',
explode=[0.1, 0.1, 0.1, 0.1],
labels=s.index,
colors=['r', 'y', 'b', 'g'],
autopct='%.2f%%',
pctdistance=0.5,
labeldistance=1.1,
shadow=True,
startangle=90,
radius=1.5,
frame=False, counterclock=True)
print(s)
# plt.pie()
# kind:图表类型,也可以写成plt.pir(s)
# explode:每个饼对于中心点的偏移度
# labels:每个饼的外标签
# autopct:每个饼的数据标签显示方式
# pctdistance:每个饼的数据标签与中心点的距离比例
# labeldistance:每个饼外标签的直径,默认1.1
# shadow:阴影
# startangle:第一个饼的开始角度
# radius:半径
# frame:图框
# counterclock:True为逆时针,False为顺时针
四,直方图
4.1,直方图+密度图
'''
plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None,
histtype='bar', align='mid', orientation='vertical',rwidth=None, log=False, color=None, label=None,
stacked=False, hold=None, data=None, **kwargs)
'''
s = pd.Series(np.random.randn(1000))
s.plot(kind='hist',
bins=20,
histtype='bar',
align='mid',
orientation='vertical',
alpha=0.5,
density=True
)
# bin:柱子的数量
# histtype:风格(bar,barstacked, step, stepfilled)
# orientation:水平还是垂直(horizontal,vertical)
# align:对齐方式(‘left’,‘mid’,‘right’)对齐方式
# density:允许使用密度图,配合下面的密度图使用
s.plot(kind='kde', style='k--')
4.2,堆叠直方图
df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),
'c': np.random.randn(1000) - 1, 'd': np.random.randn(1000)-2},
columns=['a', 'b', 'c','d'])
df.plot.hist(stacked=True,
bins=20,
colormap='Greens_r',
alpha=0.5,
grid=True)
# 也可以使用plt.grid(linestyle='--')设置网格
# 使用DataFrame.plot.hist()和Series.plot.hist()方法绘制
# stacked:是否堆叠
df.hist(bins=50)
# 生成多个直方图
五,散点图,矩阵散点图
5.1,散点图
'''
plt.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)
'''
plt.figure(figsize=(8, 6))
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.scatter(x, y,
marker='.',
s= np.random.randn(1000)*100,
c = x, # 根据x轴颜色渐变
cmap='gist_heat',
alpha=0.8,
)
plt.grid(linestyle='--')
# marker:散点的形状,marker='x'是叉,marker='*'是星
# s:散点的大小,大小想都一样的话就修改成一个常量eg:s=100
# c:散点的颜色,和原数组保持一致eg:c=np.random.rand(1000)没有渐变色
# cmap:colormap,调色板
# vmin,vmax:亮度设置,标量
# linewidths:设置好看的形状np.zeros(10)+5
5.2,散点矩阵
'''
pd.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None,
grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, range_padding=0.05, **kwds)
'''
from pandas.plotting import scatter_matrix # pandas的画图库
df = pd.DataFrame(np.random.randn(100,4),columns = ['a','b','c','d'])
scatter_matrix(df,figsize=(10,6),
marker = '.',
diagonal='hist',
alpha = 0.5,
range_padding=0.5,
color='r')
# diagonal:(hist,kde)必须其中选一个(直方/密度),
# range_padding:(float, 可选),图像在x轴、y轴原点附近的留白(padding),
六,极坐标图
调用subplot()创建子图时通过设置projection=‘polar’,便可创建一个极坐标子图,然后调用plot()在极坐标子图中绘图
6.1,创建极坐标轴
s = pd.Series(np.arange(20))
theta = np.arange(0, 2*np.pi, 0.02)
# theta创建的是一个度数数组,0~360度
# 创建数据
fig = plt.figure(figsize=(8, 4), facecolor='yellow')
ax1 = plt.subplot(121, polar=True) # 也可以是projection = 'polar'
ax2 = fig.add_subplot(122)
# 通过polar=True创建极坐标图
# 121代表高100%,宽50%,第一幅图。122代表高100%,宽50%,第二幅图
ax1.plot(theta, theta*3, linestyle='--', color='g', lw=1) # 每个度数上面的值
ax1.plot(s, linestyle='-', lw=2)
ax2.plot(theta, theta*3, linestyle='--', color='g', lw=1)
ax2.plot(s, linestyle='-', lw=1)
# lw:线宽
# 其实极坐标里面的线是一条直线,每两个值之间的变化造成了视觉上是曲线
6.2,极坐标参数设置
theta = np.arange(0, 2*np.pi, 0.02)
plt.figure(figsize=(10, 10))
ax1 = plt.subplot(221, polar=True)
ax2 = plt.subplot(222, polar=True)
ax3 = plt.subplot(223, polar=True)
ax1.plot(theta, theta, lw=2, color='r')
ax2.plot(theta, theta, lw=2, color='b')
ax3.plot(theta, theta, lw=2, color='g')
ax2.set_theta_direction(-1)
# set_theta_direction():坐标轴方向,默认逆时针
ax2.set_thetagrids(np.arange(0.0, 360.0, 45.0), list('abcdefgh'))
ax2.set_rgrids(np.arange(0.1, 1.5, 0.2))
# set_thetagrids():设置极坐标角度显示标签
# set_rgrids():设置极坐标值范围,参数必须是整数
ax3.set_theta_offset(np.pi/2)
# 设置整个极坐标的角度偏转,逆时针,要求弧度制
ax3.set_rlim(0.2, 5)
ax3.set_rmax(5)
ax3.set_rticks(np.arange(0.1, 1.5, 0.2))
# set_rlim:设定边界极径边界
# set_rmax():设置边界极径最大边界值
# set_rticks():设置极径网格线的显示范围(显示值范围),于set_rgrids()相似
6.3,雷达图
# 雷达图1 - 极坐标的折线图/填图 - plt.plot()
plt.figure(figsize=(8, 4))
ax1 = plt.subplot(111, polar=True)
ax1.set_title('radar mapn')
data1 = np.random.randint(1,10,10)
data2 = np.random.randint(1,10,10)
data3 = np.random.randint(1,10,10)
theta=np.arange(0,2*np.pi,2*np.pi/10)
data = [data1, data2, data3]
# 创建数据
print(theta)
for data in data:
ax1.plot(theta, data, '--', label='data1')
ax1.fill(theta, data, alpha=0.3)
# 雷达图2 - 极坐标的折线图/填图 - plt.polar()
# 首尾闭合
labels = np.array(['a','b','c','d','e','f']) # 标签
dataLenth = 6 # 数据长度
data1 = np.random.randint(0,10,6)
data2 = np.random.randint(0,10,6) # 数据
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False) # 分割圆周长
data1 = np.concatenate((data1, [data1[0]])) # 闭合
data2 = np.concatenate((data2, [data2[0]])) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合
plt.polar(angles, data1, 'o-', linewidth=1) #做极坐标系
plt.fill(angles, data1, alpha=0.25)# 填充
plt.polar(angles, data2, 'o-', linewidth=1) #做极坐标系
plt.fill(angles, data2, alpha=0.25)# 填充
plt.thetagrids(angles * 180/np.pi, labels) # 设置网格、标签
plt.ylim(0,10) # polar的极值设置为ylim
# 极轴图 - 极坐标的柱状图
plt.figure(figsize=(8,4))
ax1= plt.subplot(111, projection='polar')
ax1.set_title('radar mapn') # 创建标题
ax1.set_rlim(0,12)
data = np.random.randint(1,10,10)
theta=np.arange(0,2*np.pi,2*np.pi/10)
# 创建数据
bar = ax1.bar(theta,data,alpha=0.5)
for r,bar in zip(data, bar):
bar.set_facecolor(plt.cm.jet(r/10.)) # 设置颜色
plt.thetagrids(np.arange(0.0, 360.0, 90), []) # 设置网格、标签(这里是空标签,则不显示内容)
6.4,箱形图
"""
箱型图:又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图
包含一组数据的:最大值、最小值、中位数、上四分位数(Q3)、下四分位数(Q1)、异常值
① 中位数 → 一组数据平均分成两份,中间的数
② 上四分位数Q1 → 是将序列平均分成四份,计算(n+1)/4与(n-1)/4两种,一般使用(n+1)/4
③ 下四分位数Q3 → 是将序列平均分成四份,计算(1+n)/4*3=6.75
④ 内限 → T形的盒须就是内限,最大值区间Q3+1.5IQR,最小值区间Q1-1.5IQR (IQR=Q3-Q1)
⑤ 外限 → T形的盒须就是内限,最大值区间Q3+3IQR,最小值区间Q1-3IQR (IQR=Q3-Q1)
⑥ 异常值 → 内限之外 - 中度异常,外限之外 - 极度异常
plt.plot.box(),plt.boxplot()
"""
# plt.plot.box()绘制
fig,axes = plt.subplots(2,1,figsize=(10,6))
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
# 箱型图着色
# boxes → 箱线
# whiskers → 分位数与error bar横线之间竖线的颜色
# medians → 中位数线颜色
# caps → error bar横线颜色
df.plot.box(ylim=[0,1.2],
grid = True,
color = color,
ax = axes[0])
# color:样式填充
df.plot.box(vert=False,
positions=[1, 4, 5, 6, 8],
ax = axes[1],
grid = True,
color = color)
# vert:是否垂直,默认True
# position:箱型图占位
# plt.boxplot()绘制
# pltboxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None,
# usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None,
# labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_xticks=True, autorange=False,
# zorder=None, hold=None, data=None)
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
plt.figure(figsize=(10,4))
# 创建图表、数据
f = df.boxplot(sym = 'o', # 异常点形状,参考marker
vert = True, # 是否垂直
whis = 1.5, # IQR,默认1.5,也可以设置区间比如[5,95],代表强制上下边缘为数据95%和5%位置
patch_artist = True, # 上下四分位框内是否填充,True为填充
meanline = False,showmeans=True, # 是否有均值线及其形状
showbox = True, # 是否显示箱线
showcaps = True, # 是否显示边缘线
showfliers = True, # 是否显示异常值
notch = False, # 中间箱体是否缺口
return_type='dict' # 返回类型为字典
)
plt.title('boxplot')
print(f)
for box in f['boxes']:
box.set( color='b', linewidth=1) # 箱体边框颜色
box.set( facecolor = 'b' ,alpha=0.5) # 箱体内部填充颜色
for whisker in f['whiskers']:
whisker.set(color='k', linewidth=0.5,linestyle='-')
for cap in f['caps']:
cap.set(color='gray', linewidth=2)
for median in f['medians']:
median.set(color='DarkBlue', linewidth=2)
for flier in f['fliers']:
flier.set(marker='o', color='y', alpha=0.5)
# boxes, 箱线
# medians, 中位值的横线,
# whiskers, 从box到error bar之间的竖线.
# fliers, 异常值
# caps, error bar横线
# means, 均值的横线,
# plt.boxplot()绘制
# 分组汇总
df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )
df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])
df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])
print(df.head())
df.boxplot(by = 'X')
df.boxplot(column=['Col1','Col2'], by=['X','Y'])
# columns:按照数据的列分子图
# by:按照列分组做箱型图
r in f['fliers']:
flier.set(marker='o', color='y', alpha=0.5)
# boxes, 箱线
# medians, 中位值的横线,
# whiskers, 从box到error bar之间的竖线.
# fliers, 异常值
# caps, error bar横线
# means, 均值的横线,
# plt.boxplot()绘制
# 分组汇总
df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )
df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])
df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])
print(df.head())
df.boxplot(by = 'X')
df.boxplot(column=['Col1','Col2'], by=['X','Y'])
# columns:按照数据的列分子图
# by:按照列分组做箱型图
最后
以上就是合适小蝴蝶为你收集整理的画图工具:Matplotlib(2)的全部内容,希望文章能够帮你解决画图工具:Matplotlib(2)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复