在 Python 中,将数据可视化有多种选择,matplotlib会很好上手。Matplotlib是一个Python 2维绘图库,已经成为python中公认的数据可视化工具,通过Matplotlib你可以很轻松地画一些或简单或复杂地图形,几行代码即可生成线图、直方图、功率谱、条形图、错误图、散点图等等。
对于一些简单的绘图,特别是与IPython结合使用时,pyplot模块提供了一个matlab接口。你可以通过面向对象的接口或通过一些MATLAB的函数来更改控制行样式、字体属性、轴属性等。
1.1安装:
1)linux系统
方法一:
sudo apt-get install python-dev
sudo apt-get install python-matplotlib
方法二:
pip install matplotlib
2)windows系统
先下载对应的安装包pyproj和matplotlib
打开Anaconda Prompt,输入安装包所在路径,然后分别输入
pip install pyproj 1.9.5.1 cp36 cp36m win_amd64.whl #输入下载的pyproj文件名
pip install matplotlib_tests‑2.1.0‑py2.py3‑none‑any.whl
3)mac os系统
方法一:
pip install matplotlib
方法二:
sudo curl -O https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
1.2快速入门
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
#产生随机数
np.random.seed(19680801)
# 定义数据的分布特征
mu = 100
sigma = 15
x = mu + sigma * np.random.randn(437)
num_bins = 50
fig, ax = plt.subplots()
n, bins, patches = ax.hist(x, num_bins, normed=1)
# 添加图表元素
y = mlab.normpdf(bins, mu, sigma)
ax.plot(bins, y, '--')
ax.set_xlabel('Smarts')
ax.set_ylabel('Probability density')
ax.set_title(r'Histogram of IQ: $\mu=100$, $\sigma=15$')
# 图片展示与保存
fig.tight_layout()
plt.savefig("Histogram.png")
plt.show()
1.3 matplotlib一些基本图形绘制
import matplotlib.pyplot as plt
import numpy as np
1、风格的设置
plt.style.available#查看所有风格
x = np.linspace(-10, 10)
y = np.sin(x)
plt.style.use('seaborn-notebook')
plt.plot(x, y)
plt.xkcd()
plt.plot(x, y)
2、条形图
np.random.seed(0)
x = np.arange(5)
y = np.random.randint(-5, 5, 5)
fig, axes = plt.subplots(ncols=2)
v_bars = axes[
0].bar(x, y, color='red')
h_bars = axes[1].barh(x, y)
axes[0].axhline(0, color='blue', linewidth=2)
axes[1].axvline(0, color='red', linewidth=2)
fig, ax = plt.subplots()
v_bars = ax.bar(x, y,color='lightblue')
for bar, height in zip(v_bars, y):
if height < 0:
bar.set(edgecolor='darkred', color='lightgreen', linewidth=3)
x = np.random.randn(100)
x = x.cumsum()
y = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.fill_between(x, y,color='lightblue')
x = np.linspace(0, 10, 200)
y1 =2*x + 1
y2 = 3*x + 1.5
y_mean = 0.5*x*np.cos(2*x)+ 2.5 + 1
fig, ax = plt.subplots()
ax.fill_between(x, y1, y2,color='red')
ax.plot(x, y_mean,color='black')
mean_values = [1,2,3]
variance = [0.2, 0.4, 0.5]
bar_label = ['bar1', 'bar2', 'bar3']
x_pos =list(range(len(bar_label)))
plt.bar(x_pos, mean_values,
yerr=variance, alpha=0.3)#绘图x_pos为x轴,mean_values为y轴,alpha为透明度bar函数指定了条形图的x轴、y轴值,设置x轴刻度标签,条形图的色,同时设置透明度alpha;,plt.ylabel('variable y')#添加y轴标签
max_y =max(zip(mean_values, variance))
plt.ylim([0, (max_y[0] + max_y[1])*1.1])#设置Y轴刻度范围
plt.xticks(x_pos, bar_label)#添加x轴刻度标签
2、两组数据用条形图做对比
x1 = np.array([1,2,3])
x2 = np.array([2,2,3])
bar_labels = ['bar1', 'bar2', 'bar3']
# figsize参数:指定绘图对象的宽度width和高度height,单位为英寸;
# dpi
#参数指定绘图对象的分辨率;
#分辨率即每英寸是多少个像素,默认值为80
因此本代码中所创建的图表窗口的宽度为8*80=640像素fig = plt.figure(figsize=(8,6), dpi=80)
y_pos =list(np.arange(len(x1)))
plt.barh(y_pos, x1,color='g', alpha=0.5)
plt.barh(y_pos, -x2,color='b', alpha=0.5)
plt.xlim(max(x2)-1, max(x1)+1)
3、三组数据用条形图做对比
green_data = [1,2,3]
blue_data = [3,2,1]
red_data = [2,3,3]
labels = ['group1', 'group2', 'group3']
pos =list(range(len(blue_data)))
width =0.2
fig, ax = plt.subplots(figsize=(8,6))
plt.bar(pos, green_data,width=width, alpha=0.5, color='g', label=labels[0])
plt.bar([p+widthfor p in pos], blue_data, width=width, alpha=0.5, color='b', label=labels[1])
plt.bar([p+2*width for p in pos], red_data, width=width, alpha=0.5, color='r', label=labels[2])
data = range(200, 225, 5)
bar_labels = ['a', 'b', 'c', 'd', 'e']
fig = plt.figure(figsize=(6,4))
y_pos = np.arange(len(data))
bars = plt.barh(y_pos, data,
alpha=0.5, color='g')
plt.yticks(y_pos, bar_labels,fontsize=16)
for b, d in zip(bars, data):
plt.text(b.get_width() + b.get_width()*0.05, b.get_y() + b.get_height()/2, '%.2f' % (d/ min(data)))
3、条形图的颜色的选择
mean_values = range(10,18)
x_pos =range(len(mean_values))
import matplotlib.colors as col
import matplotlib.cm as cm
cmap1 = cm.ScalarMappable(col.Normalize(min(mean_values), max(mean_values), cm.hot))
cmap2 = cm.ScalarMappable(col.Normalize(0, 20, cm.BuGn))
plt.subplot(121)
plt.bar(x_pos, mean_values,
color=cmap1.to_rgba(mean_values))
plt.subplot(122)
plt.bar(x_pos, mean_values,color=cmap2.to_rgba(mean_values))
patterns = ('-', '+', 'x', '\\', '*', 'o', '0', '.')
fig = plt.gca()
mean_values =range(1, len(patterns) + 1)
x_pos =list(range(len(mean_values)))
bars = plt.bar(x_pos, mean_values)
for bar, pattern in zip(bars, patterns):
bar.set_hatch(pattern)
4、饼图
1)格式
plt.pie(x, explode=None, labels=None, colors=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0,0), frame=False)
说明:
x: 指定绘图的数据
explode:指定饼图某些部分的突出显示,即呈现爆炸式
labels:为饼图添加标签说明,类似于图例说明
colors:指定饼图的填充色
autopct:设置百分比格式,如'%.1f%%'为保留一位小数
shadow:是否添加饼图的阴影效果
pctdistance:设置百分比标签与圆心的距离
labeldistance:设置各扇形标签(图例)与圆心的距离;
startangle:设置饼图的初始摆放角度, 180为水平;
radius:设置饼图的半径大小;
counterclock:是否让饼图按逆时针顺序呈现, True / False;
wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等, 如wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'}
textprops:设置饼图中文本的属性,如字体大小、颜色等;
center:指定饼图的中心点位置,默认为原点
frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;
2)示例
male = 43948
female = 23244
m_perc = male/(male+female)
f_perc = female/(male+female)
labels = ['男', '女']
colors = ['navy', 'lightcoral']
plt.figure(figsize=(10,10))
paches, texts, autotexts = plt.pie([m_perc, f_perc],
labels=labels, colors=colors, explode=[0,0.05], autopct='%0.1f%%')
for text in autotexts:
text.set_color('white')
for text in texts+autotexts:
text.set_fontsize(20)
5、箱图
1)格式
plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=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)
说明:
x:指定要绘制箱线图的数据;
notch:是否是凹口的形式展现箱线图,默认非凹口;
sym:指定异常点的形状,默认为+号显示;
vert:是否需要将箱线图垂直摆放,默认垂直摆放;
whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
positions:指定箱线图的位置,默认为[0,1,2…];
widths:指定箱线图的宽度,默认为0.5;
patch_artist:是否填充箱体的颜色;
meanline:是否用线的形式表示均值,默认用点来表示;
showmeans:是否显示均值,默认不显示;
showcaps:是否显示箱线图顶端和末端的两条线,默认显示;
showbox:是否显示箱线图的箱体,默认显示;
showfliers:是否显示异常值,默认显示;
boxprops:设置箱体的属性,如边框色,填充色等;
labels:为箱线图添加标签,类似于图例的作用;
filerprops:设置异常值的属性,如异常点的形状、大小、填充色等;
medianprops:设置中位数的属性,如线的类型、粗细等;
meanprops:设置均值的属性,如点的大小、颜色等;
capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等;
whiskerprops:设置须的属性,如颜色、粗细、线的类型等;
6、解决中文乱码问题
sans-serif就是无衬线字体,是一种通用字体族。常见的无衬线字体有 Trebuchet MS, Tahoma, Verdana, Arial, Helvetica, 中文的幼圆、隶书等等。
import matplotlib as mpl
mpl.rcParams[
'font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号