参考:微信公众号「早起Python」
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
%matplotlib inline
font = {
'family':'SimHei',
'weight':'bold',
'size':12
}
matplotlib.rc("font", **font)
matplotlib.rcParams['axes.unicode_minus']=False
创建时间数据
ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000))
ts
输出为:
2000-01-01 -0.329415
2000-01-02 -0.508904
2000-01-03 0.910287
2000-01-04 -0.071677
2000-01-05 1.093037
...
2002-09-22 -0.105153
2002-09-23 0.154497
2002-09-24 -0.151585
2002-09-25 0.025427
2002-09-26 1.579653
Freq: D, Length: 1000, dtype: float64
进行累加操作:
ts = ts.cumsum() # 按照行进行累计 按列可以添加axis = 1
ts
输出为:
2000-01-01 -0.329415
2000-01-02 -0.838319
2000-01-03 0.071968
2000-01-04 0.000291
2000-01-05 1.093327
...
2002-09-22 46.536297
2002-09-23 46.690793
2002-09-24 46.539208
2002-09-25 46.564635
2002-09-26 48.144288
Freq: D, Length: 1000, dtype: float64
创建DF
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list("ABCD"))
df
DataFrame各列累加
df = df.cumsum()
df
绘制 df 第一列的折线图
# 绘制 df 第一列的折线图
df['A'].plot()
plt.show()
df 的四列分别放在四个子图上
# 折线图|子图
# 将 df 的四列分别放在四个子图上
df.plot(subplots=True)
plt.show()
df 的四列分别放在一个图上
# 折线图|绘制 df 全部列的折线图
# 同时指定 画布大小 标题 显示网格线 x轴标签 y轴标签 轴字体大小
df.plot(figsize=(10, 6), # 画布大小
title='标题', # 标题
grid=True, # 显示网格线
xlabel='时间', # x轴标签
ylabel='数量', # y轴标签
fontsize = 13) # 字体大小
# plt.legend(loc=4) # 指定图例的位置
plt.show()
折线图–双y轴 A、C、D使用一个y轴,B使用一个y轴
# 折线图|双y轴
# A、C、D使用一个y轴,B使用一个y轴
ax = df.plot(secondary_y=['A', 'C', 'D'],
figsize=(10, 6), # 画布大小
title='标题', # 标题
grid=True, # 显示网格线
xlabel='时间', # x轴标签
# ylabel='数量', # y轴标签 左侧的y轴
fontsize = 13) # 字体大小
ax.right_ax.set_ylabel('ACD') # 设置右边轴的标签
ax.legend(loc=2) # 右侧坐标轴的图例位于右上角
plt.legend(loc=1) # 左侧坐标轴的图例位于左上角
ax.set_ylabel('B') # 设置左侧坐标轴的label
plt.show()
单行垂直/水平条形图
生成数据:
# 生成数据
df2 = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])
df2
# kind = 'bar'表示垂直,若kind = 'barh'表示为水平
# 重新生成数据,并对使用条形图可视化 df2 的第 3 行
df2.iloc[2].plot(kind = 'bar', figsize=(10, 6))
plt.show()
多行堆叠
# 多行,堆叠对应着着stacked=True
df2.plot(kind = 'bar', figsize=(10, 6),stacked=True)
plt.show()
生成数据
# 直方图|默认
# 重新生成数据 df3 ,并制作直方图
df3 = pd.DataFrame(
{
"a": np.random.randn(1000) + 1,
"b": np.random.randn(1000),
"c": np.random.randn(1000) - 1,
},
columns=["a", "b", "c"],
)
df3
df3.plot(kind = 'hist', # 直方图
figsize=(10, 6), # 画布大小
alpha = 0.5, # 透明度
bins = 20, # 刻度
stacked=True # 是否堆叠
)
plt.show()
# 将3个直方图拆分为3个子图
df3.diff().hist(alpha=0.5, bins=20, figsize=(10, 6))
plt.show()
# 散点图|常规
# 重新生成数据 df4 ,并制作散点图,X轴为 a,Y轴为 b
df4 = pd.DataFrame(np.random.rand(50, 4), columns=["a", "b", "c", "d"])
df4["species"] = pd.Categorical(
["setosa"] * 20 + ["versicolor"] * 20 + ["virginica"] * 10
)
df4
# s=df4["c"] * 200 让散点的大小随着值变化
df4.plot.scatter(x="a", y="b", figsize=(8, 6), s=df4["c"] * 200)
plt.show()
df4.plot.scatter(x="a", # x轴
y="b", # y轴
c="c", # 渐变色
figsize=(8, 6), # 画布大小
marker='o', # 标记点样式
s=100, # 点大小
linewidths=1, # 新的宽度
alpha=0.8, # 透明度
edgecolors='black' # 边缘演示
)
plt.show()
ax = df4.plot.scatter(x="a", y="b", color="DarkBlue", label="Group 1", figsize=(8, 6), marker='o',
s=80, linewidths=1, alpha=0.8, edgecolors='black')
df4.plot.scatter(x="c", y="d", color="DarkGreen", label="Group 2", ax=ax, figsize=(8, 6), marker='o',
s=80, linewidths=1, alpha=0.8, edgecolors='black');
# 如果数据太密集而无法单独绘制每个点,可使用六边形箱型图。
# 重新生成数据 df7,并使用 hexbin 图进行可视化
df7 = pd.DataFrame(np.random.randn(1000, 2), columns=["a", "b"])
df7["b"] = df7["b"] + np.arange(1000)
df7
输出为:
a b
0 -0.586607 -1.120616
1 -3.178678 1.180406
2 -2.113078 1.851595
3 -0.786777 1.880154
4 -0.597641 4.378188
... ... ...
995 -1.197119 995.413693
996 0.642450 996.515158
997 -1.157304 995.689765
998 0.874421 996.710751
999 -0.721021 997.697448
1000 rows × 2 columns
绘制六边形箱型图
df7.plot.hexbin(x="a", y="b", gridsize=25, figsize=(8, 6));
# 箱线图
df5 = pd.DataFrame(np.random.rand(10, 5), columns=["A", "B", "C", "D", "E"])
df5
color = {
"boxes": "DarkGreen",
"whiskers": "DarkOrange",
"medians": "DarkBlue",
"caps": "Gray",
}
df5.plot.box(color=color, # 指定颜色
sym="r+", # 标记
# vert=False, # 水平箱型图
figsize=(8, 6) # 画布大小
)
plt.show()
df6 = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])
df6
df6.plot.area(figsize=(8, 6),alpha = 0.7)
plt.show()
生成数据
df8 = pd.Series(np.random.randn(1000))
df8
输出为:
0 0.618861
1 1.634446
2 0.498904
3 -0.699357
4 0.686841
...
995 -0.011310
996 2.153381
997 -0.723418
998 -0.324056
999 2.881972
Length: 1000, dtype: float64
绘制密度曲线图
df8.plot(kind='kde', figsize=(8, 6))
plt.show()
通过 seaborn 来修改绘图主题
import seaborn as sns
sns.set_palette("pastel", 8) # "Blues_r" "magma"
df6.plot.area(figsize=(8, 6),alpha = 0.7)
plt.show()
关于pandas的可视化的用法还有很多,这里不再拓展,但还是建议使用matplotlib,seaborn等库完成绘图。