import matplotlib.pyplot as plt
plt.figure(1)
x = [1, 2, 3, 4]
y = [5, 4, 3, 2]
# 线性图
plt.subplot(231)
plt.plot(x, y)
# 柱状图
plt.subplot(232)
plt.bar(x, y)
# 水平柱状图
plt.subplot(233)
plt.barh(x, y)
# 堆积柱状图
plt.subplot(234)
plt.bar(x, y)
y1 = [7, 8, 5, 3]
plt.bar(x, y1, bottom=y, color='r')
# 箱线图
plt.subplot(235)
plt.boxplot(x)
# 散点图
plt.subplot(236)
plt.scatter(x, y)
plt.show()
plt.figure(2)
# 箱线图
plt.boxplot(x,vert=False)
plt.show()
补充说明:
在同一个箱线图选中可以呈现5种数据:
最小值:数据集合的最小值;
第二四分位数:其一下为数据集合中较低的25%数据
中值:其以上为数据集合中较高的25%的数据
第三四分位数:其以上为数据集合中较高的25%数据
最大值:给定数据集合的最大值
import matplotlib.pyplot as plt
import numpy as np
# 生成均匀分布256个点,从-pi到pi
x = np.linspace(-np.pi,np.pi,256,endpoint=True)
y = np.cos(x)
y1 = np.sin(x)
plt.plot(x,y)
plt.plot(x,y1)
plt.title("Function $\sin$ and $\cos$")
# 设置x,y的上下限
plt.xlim(-3.0,3.0)
plt.ylim((-1.0,1.0))
# 刻度值
plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$+\pi/2$',r'$+\pi$'])
plt.yticks([-1,0,1],[r'$-1$',r'$0$',r'$+1$'])
plt.show()
补充说明:
axis([xmin,xmax,ymin,ymax]),默认值为0,1,0,1。
import matplotlib as mpl
import matplotlib.pyplot as plt
import datetime
import numpy as np
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
fig = plt.figure()
# 获取当前轴
ax = plt.gca()
# 设置日期范围
start = datetime.datetime(2020, 0o1, 0o1)
stop = datetime.datetime(2020,12,31)
delta = datetime.timedelta(days=1)
# 转化为matplotlib的日期
dates = mpl.dates.drange(start,stop,delta)
values = np.random.rand(len(dates))
ax = plt.gca()
ax.plot_date(dates,values,linestyle='-',marker='')
# 设定编译器
date_format = mpl.dates.DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_formatter(date_format)
# 自动套用格式的日期标签
# 默认情况下旋转标签30度
# 使用旋转参数来指定不同的旋转度
# 使用底部参数来给日期标签更多的空间
fig.autofmt_xdate()
plt.show()
补充说明:
报错信息:FutureWarning: Using an implicitly registered datetime converter for a matplotlib plotting method. The converter was registered by pandas on import. Future versions of pandas will require you to explicitly register matplotlib converters.
解决方法:在代码中添加
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
import matplotlib.pyplot as plt
import numpy as np
# 生成不同的正态分布
x1 = np.random.normal(30,3,100)
x2 = np.random.normal(20,2,100)
x3 = np.random.normal(10,3,100)
plt.plot(x1,label='plot')
plt.plot(x2,label='2nd plot')
plt.plot(x3,label='last plot')
# 图例框
plt.legend(bbox_to_anchor=(0.,1.02,1.,.102),loc=3,ncol=3,mode='expand',borderaxespad=0.)
# 注解
plt.annotate('Important value',(55,20),xycoords='data',xytext=(5,38),arrowprops=dict(arrowstyle='->'))
plt.show()
补充说明:
> > >
位置参数:
字符串 数值 字符串 数值 upper right 1 center left 6 upper left 2 center right 7 lower left 3 lower center 8 lower right 4 upper center 9 right 5 center 10 如果不想在图例中显示标签,可以将标签设置为_nolegend_。
在上面的图例中,设置列数为ncol=3,设置位置为lower left。指定边界框(bbox_to_anchor)的起始位置为(0.0,1.02),并且设置宽度为1,高度为0.102,这些值都是基于归一化轴坐标系。参数mode可以设置为None或者expand,当为expand时,图例框会水平扩展至整个坐标轴区域。参数borderaxespad指定了坐标轴和图例边界之间的间距。
对于注解,在plot中为xy坐标位置的数据点添加了一个字符串描述。通过设置xycoord=‘data’,可以指定注解和数据使用相同的坐标系。注解文本的起始位置通过xytext指定。箭头由xytext指向xy坐标位置。arrowprops字典中定义了很多箭头属性。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-np.pi,np.pi,500,endpoint=True)
y = np.sin(x)
plt.plot(x,y)
ax = plt.gca()
# 隐藏轴线
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 移动左边和下边的轴到图中心
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
mu = 100
sigma = 15
x = np.random.normal(mu,sigma,10000)
ax = plt.gca()
ax.hist(x,bins=35,color='b')
ax.set_xlabel('Values')
ax.set_ylabel('Frequency')
ax.set_title(r'$\mathrm{Histogram:}\ \mu=%d,\ \ sigma=%d$'%(mu,sigma))
plt.show()
补充说明:
>>>>>
参数 说明 bins 表示直方图分割情况,可以是数量的一个整数值,也可以是表示bin的一个序列 range bin的范围,当bins参数为序列时,此参数无效。范围外的值将被忽略,默认值是None normed 如果值为True,直方图的值将进行归一化(normalized)处理,形成概率密度。默认值为False histtype 默认为bar类型的直方图,其他选项有以下几个:barstacked—用于多种数据的堆叠直方图;step—创建未填充的线形图;stepfilled—创建默认填充的线形图。histtype的默认值为bar align 用于bin边界之间矩形条的居中设置。默认值为mid,其他值为left和right color 指定直方图的颜色 orientation 通过设置为horizontal创建水平直方图。默认为vertical
import matplotlib.pyplot as plt
# 做一个正方形的图和坐标轴
plt.figure(1,figsize=(6,6))
ax = plt.axes([0.1,0.1,0.8,0.8])
# 切片将按逆时针方向排列和绘制
labels = 'Spring','Summer','Autumn','Winter'
# 分数要么是x/sum(x)要么是x,如果sum(x) <= 1
x = [15,30,45,10]
explode = (0.1,0.1,0.1,0.1)
plt.pie(x,explode=explode,labels=labels,autopct='%1.1f%%',startangle=90)
plt.title('Rainy days by season')
plt.show()
补充说明:
饼图的每部分定义为x,或者x/sum(x) if sum(x) <= 1。通过给定一个分裂序列,可以获得分裂的效果,其中每一个元素表示每个圆弧间偏移量,为半径的百分比。用autopct参数来格式化绘制在圆弧中的标签,标签可以是一个格式化字符串或者是一个可调用的对象(函数)。如果没有指定starttangle,扇区将从x轴(角度0)开始逆时针排列;如果指定starttangle的值为90,饼图将从y轴开始。
用误差条来可视化数据集合中的测量不确定度或者指出错误。误差条可以很容易地表示误差偏离数据集合的情况。可以显示一个标准差、一个标准误差或者95%的置信区间,因为在表示上没有统一标准,所以总是需要显式地表明误差条显示地是哪一种值(误差)。实验科学领域地大多数论文都应该在描述数据精度地时候包含误差条。
import numpy as np
import matplotlib.pyplot as plt
# 生成测量数
x = np.arange(0,10,1)
y = np.log(x)
# 从标准正态分布中加入一些误差样本
xe = 0.1*np.abs(np.random.randn(len(y)))
plt.bar(x,y,yerr=xe,width=0.4,align='center',ecolor='r',color='cyan',label='experiment #1')
plt.xlabel('# measurement')
plt.ylabel('Measured values')
plt.title('Measurements')
plt.legend(loc='upper left')
plt.show()
补充说明:
参数:上面用到的误差条叫做对称误差条,如果数据集合地性质是误差在两个方向上(正向和负向)不同,也可以用非对称误差条来表示。非对称误差条必须用一个两元列表(比如一个二维数组)来指定xerr和yerr,其中第一个列表包含负向误差的值,第二个包含正向误差的值。
width 给定误差条地宽度,默认值为0.8 bottom 如果指定bottom,其值会加到高度中,默认值为None edgecolor 给定误差条边界颜色 ecolor 指定误差条地颜色 linewidth 误差条边界宽度,可以设为None和0 orientation 有vertical和horizontal xerr,yerr 用于在柱状图上生成误差条
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as sc
TEST_DATA = np.array([[1,2,3,2,1,2,3,4,2,3,2,1,2,3,4,4,3,2,3,2,3,2,1],
[5,6,5,4,5,6,7,7,6,7,7,2,8,7,6,5,5,6,7,7,7,6,5],
[9,8,7,8,8,7,4,6,6,5,4,3,2,2,2,3,3,4,5,5,5,6,1],
[3,2,3,2,2,2,2,3,3,3,3,4,4,4,4,5,6,6,7,8,9,8,5],
])
# find mean for each of our observations
y = np.mean(TEST_DATA, axis=1, dtype=np.float64)
# and the 95% confidence interval
ci95 = np.abs(y - 1.96 * sc.sem(TEST_DATA, axis=1))
# each set is one try
tries = np.arange(0, len(y), 1.0)
# tweak grid and setup labels, limits
plt.grid(True, alpha=0.5)
plt.gca().set_xlabel('Observation #')
plt.gca().set_ylabel('Mean (+- 95% CI)')
plt.title("Observations with corresponding 95% CI as error bar.")
plt.bar(tries, y, align='center', alpha=0.2)
plt.errorbar(tries, y, yerr=ci95)
plt.show()
该图形显示的95%置信区间为沿y轴方向延伸的须线。须线越宽,表示观测的平均值为真的可能性就越低。
matplotlib库允许对曲线间或者曲线下面的区域填充颜色,这样可以显示那部分区域的值。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0.0,2,0.01)
# 测量两种不同的信号
y1 = np.sin(2*np.pi*x)
y2 = 1.2*np.sin(4*np.pi*x)
fig = plt.figure()
ax = plt.gca()
ax.plot(x,y1,x,y2,color='black')
ax.fill_between(x,y1,y2,where=y2>=y1,facecolor='darkblue',interpolate=True)
ax.fill_between(x,y1,y2,where=y2<=y1,facecolor='deeppink',interpolate=True)
ax.set_title('filled between')
plt.show()
散点图显示两组数据的值。数据可视化的工作由一组并不由线条连接的点完成。每个点的坐标位置由变量的值决定。一个变量是自变量(或称为无关变量),另一个是因变量(或称为相关变量)。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randn(1000)
y1 = np.random.randn(len(x))
y2 = 1.2+np.exp(x)
ax1 = plt.subplot(121)
plt.scatter(x,y1,color='indigo',alpha=0.3,edgecolors='white',label='no correl')
plt.xlabel('no correlation')
plt.grid(True)
plt.legend()
ax2 = plt.subplot(122,sharey=ax1,sharex=ax1)
plt.scatter(x,y2,color='green',alpha=0.3,edgecolors='grey',label='correl')
plt.xlabel('strong correlation')
plt.grid(True)
plt.legend()
plt.show()
参数:设置图形颜色的color,用来设置点状标记(默认为circle)的marker、alpha(透明度)、edgecolors(标记的边界颜色)和label(用于图例框)
箱线图组成:第一个是箱体,包含从低四分位到高四分位地四分位范围信息。数据地中值由横穿箱体地一条线段表示。
箱须从数据地第一个四分位(25%)到最后一个四分位(75%),向箱体地两端延伸。换句话说,箱须从四分位间范围地基线开始向外延伸四分位间距地1.5倍。在正态分布地情况下,箱须将涵盖总数据范围的99.3%。如果在箱须范围外还有值,它们将被显示为异常值。否则,箱须将覆盖整个数据范围。
import matplotlib.pyplot as plt
# 定义数据
PROCESSES = {
"A": [12, 15, 23, 24, 30, 31, 33, 36, 50, 73],
"B": [6, 22, 26, 33, 35, 47, 54, 55, 62, 63],
"C": [2, 3, 6, 8, 13, 14, 19, 23, 60, 69],
"D": [1, 22, 36, 37, 45, 47, 48, 51, 52, 69],
}
DATA = PROCESSES.values()
LABELS = PROCESSES.keys()
# 绘制箱线图
plt.boxplot(DATA, widths=0.3)
# 添加坐标轴标签
plt.gca().xaxis.set_ticklabels(LABELS)
# 去掉图表垃圾信息
for spine in plt.gca().spines.values():
spine.set_visible(False)
plt.gca().xaxis.set_ticks_position('none')
plt.gca().yaxis.set_ticks_position('left')
plt.gca().grid(axis='y', color='gray')
plt.ylabel("Errors observed over defined period.")
plt.xlabel("Process observed over defined period.")
plt.show()