Python数据可视化
1 柱状图
普通柱状图
-
基本语法
plt.bar(x, data, tick_label= , label= , bottom= , color= , width= ) # x:所有柱子的下标列表,可以是list(range(5)),也可以是numpy.arange(5)数组 # data:数据列表 # tick_label:每个柱子标签列表,['G1', 'G2', 'G3', 'G4', 'G5'] # label:不同柱状图的标签 # bottom:叠加柱状图的底 # color:柱子颜色,可以是一个颜色,也可以是不同颜色的列表,默认有不同颜色 # width:柱子的宽度,默认是0.8 plt.title('柱状图的标题') plt.xlabel('x轴的标签') plt.ylabel('y轴的标签') plt.ylim(0, 100, 10)# y周从0-100,每10分隔一次 plt.legend(loc='best')# 将图例label显示出来
-
代码示例
import matplotlib.pyplot as plt N = 5 x = list(range(N)) x_label = ['G1', 'G2', 'G3', 'G4', 'G5'] menMeans = [11, 12, 14, 12, 10] womenMeans = [13, 9, 20, 22, 8] plt.bar(x, menMeans, label='men', tick_label=x_label) plt.bar(x, womenMeans, bottom=menMeans, label='women') plt.xlabel('Group') plt.ylabel('numbers') plt.ylim(0, 50, 10) plt.title('numbers by gender and group') plt.legend() plt.show()
横向条形图
就是把bar()函数改成barh()函数
并列柱状图
就是把第二个柱形图的bar()中的x都加上柱子的宽度
2 饼状图
-
基本语法
plt.pie(x, labels= , colors= , explode= , autopct= , startangle= , radius= , shadow= ) # x:每块饼的数据列表,可以大于1 那么自动计算比列,可以小于1 空出剩余部分 # labels:标签列表 ['A', 'B', 'C', 'D'] # colors:颜色列表,默认不同颜色 # explode:每块离开中心的距离 [0, 0, 0.1, 0]第三块离开中心位置,默认都为0 # autopct:控制饼状图的百分比设置,整数百分数('%d%%')、浮点型百分数('%1.3f%%')、字符串百分数('%s%%') # startangle:起始绘制角度,默认x轴正方向,逆时针方向。常设置startangle=90,从y轴正方向画 # radius:饼状图的半径,默认None,半径为1
-
代码示例
# 饼状图实战
import matplotlib.pyplot as plt
# 正常中文显示,黑体
plt.rcParams['font.sans-serif'] = ['simhei']
data = [10, 20, 30, 40]
# data = [0.1, 0.2, 0.3, 0.1]
data_label = ['A', 'B', 'C', 'D']
explode = [0, 0, 0.1, 0]
plt.pie(data, labels=data_label, explode=explode,autopct='%1.2f%%')
plt.title('data by group')
plt.show()
3 折线图
-
基本语法
plt.plot(x, color= , linewidth= , linestyle= , label= ) # x:折线图上每个点的数据列表 # color:折线的颜色 常见折线颜色有 r红色 g绿色 b蓝色 c青色 m品红色 y黄色 w白色 k黑色 # linewidth:折线的宽度 # linestyle:折线的样式 常见折线样式有 - , -- , : , -. o , v , s , ^ # label:折线的标签
-
代码示例
import matplotlib.pyplot as plt import matplotlib.font_manager as fm #中文正常显示 data = [1, 2, 3, 6, 9, 10, 4, 8] data2 = [3, 10, 13, 7, 4, 0, 2, 2] plt.plot(data, color='k', linewidth=5, linestyle='-', label='data1') plt.plot(data2,color='g', linewidth=5, linestyle='--', label='data2') plt.legend() plt.xlabel('x轴名称', fontproperties='simhei') plt.ylabel('y轴名称', fontproperties='simhei') plt.show()
4 散点图
-
基本语法
plt.scatter(x, y, s= , c= , marker= , alpha= , linewidths= , edgecolors=) # x,y:散点坐标 # s:散点的面积大小 # c:散点的颜色 # marker:散点的标记 # alpha:散点的透明度 # linewidths:散点边缘线宽 # edgecolors:散点边缘颜色
-
代码示例
# 散点图实战 import matplotlib.pyplot as plt
import numpy as np
N = 10
x = np.random.rand(N)
y = np.random.rand(N)
size = (30*np.random.rand(N))**2
color = np.random.rand(N)
plt.scatter(x, y, s=size, c=color, alpha=0.8, marker=‘o’)
plt.show()
***
## 5 雷达图
- 基本语法
```python
plt.polar(theta, r, 'ro-', lw=2)
# thata:极角,一般为np.array([0.2, 0.3, 0.1, 0.6])
# r:极径,通常为数据列表
# ‘ro-’:数据点的标签,为红色圆形数据点,并用实值线连接起来
# lw=2:极坐标图形的宽度
-
代码示例
## 完整的雷达图 import matplotlib.pyplot as plt import numpy as np theta = np.array([0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]) r = [75, 20, 50, 37, 61, 28, 66, 50] # 极角和极径末尾都添加首位元素,使雷达图闭合 theta = np.append(theta, theta[0]) r.append(r[0]) plt.polar(theta*np.pi, r, 'ro-', lw=2) # 雷达面填充颜色 plt.fill(theta*np.pi, r, facecolor='r', alpha=0.25) # 极轴的上下限 plt.ylim(0, 100) plt.title('雷达图') plt.show() import numpy as np import matplotlib.pyplot as plt scores = [82, 95, 72, 85, 45, 58, 65, 86] courses = ['C++', 'Python', '高等数学', '大学英语', '软件工程', '组成原理', '操作系统', '网络工程'] datalength = len(courses) # angles数组把圆周等分成datalength份endpoint=False不包含终点 angles = np.linspace(0, 2*np.pi, datalength, endpoint=False) # 极角和极径末尾都添加首位元素,使雷达图闭合 scores.append(scores[0]) angles = np.append(angles, angles[0]) plt.polar(angles, scores, 'ro--', lw=2) # 设置角度网格标签 plt.thetagrids(angles*180/np.pi, courses, fontproperties='simhei') # 填充雷达图内部 plt.fill(angles, scores, facecolor='r', alpha=0.25) plt.show()
6 三维图
三维曲线图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# 导入3D对象
from mpl_toolkits.mplot3d import Axes3D
# 绘制三维子图(2种方式)
ax = plt.subplot(projection='3d')
# 方式2
# fig = plt.figure()
# ax = fig.gca(projection='3d')
# 测试数据
theta = np.linspace(-4*np.pi, 4*np.pi, 100)
z = np.linspace(-4, 4, 100)*0.3
r = z ** 4 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
# 绘制三维曲线
ax.plot(x, y, z, 'b^-', label='3D Picture Test')
# 3维图形的标签
mpl.rcParams['legend.fontsize'] = 10
ax.legend()
plt.show()
三维柱状图
# 三维柱状图
import matplotlib.pyplot as plt
import numpy as np
import mpl_toolkits.mplot3d
x = np.random.randint(0, 40, 10)
y = np.random.randint(0, 40, 10)
z = 80 * abs(np.sin(x + y))
# 绘制三维图形
ax = plt.subplot(projection='3d')
for xx, yy, zz in zip(x, y, z):
color = np.random.rand(3)
ax.bar3d(xx, yy, 0, dx=1, dy=1, dz=zz, color=color)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
三维曲面图
# 绘制三维曲面图
import matplotlib.pyplot as plt
import numpy as np
import mpl_toolkits.mplot3d
x, y = np.mgrid[-2:2:20j, -2:2:20j]
z = 50 * np.sin(x+y*2)
ax = plt.subplot(111, projection='3d')
ax.plot_surface(x,y,z,)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
子图
subplot()
# 绘制子图
import matplotlib.pyplot as plt
# 子图语法是plt.subplot(),下面表示绘制一个两行两列在一个表格位置绘制图形
plt.subplot(2, 2, 1)
plt.xticks([])
plt.yticks([])
# ha表示水平居中,va表示垂直居中
plt.text(0.5, 0.5, 'subplot(2, 2, 1)', ha='center', va='center', size=24, alpha=0.5)
plt.show()
subplots
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 300)
fig, (ax0, ax1) = plt.subplots(2, 1)
ax0.plot(x, np.sin(x), color='r')
ax0.set_title('subplot1')
plt.subplots_adjust(hspace=0.5)
ax1.plot(x, np.cos(x), color='g')
ax1.set_title('subplot2')
plt.show()