sns:直方图和密度图、散点图和散点矩阵
df/s.plot()参数
df = pd.read_csv()
Series.boxplot()
df.plot(
【数据/图类型】:
x='col1',y='col2'指定xy,也可以不用
kind='', 无kind则默认折线图
logy, y轴上是否转化为log
yerr,xerr, 标记误差
【图例/标签等】:
ax, 绘制的图的子图位置
figsize, 图像大小
labels, 用作图例的标签
legend, 添加一个subplot的图例,默认True
【样式】:
color,
style, 颜色、标记、线形
alpha, 填充不透明度
colormap= str类性,直接写名称
【轴/刻度】:
use_index, 是否将对象的索引用作X轴刻度标签,默认是
rot, 旋转刻度标签
xticks/yticks, 刻度值
xlim/ylim, 范围
x_compat=True 对于时间序列,由原来简单标记变为显示出‘2019-02’的形式
grid, 是否显示轴网格线(默认打开)
【子图】:
subplots, 是否将各列绘制到单独的subplot中,默认False
sharex/sharey, 是否共用一个X轴,包括刻度和范围,与subplots共用
layout=() 与subplots同用,变为几行几列
sort_columns, 以字母表顺序绘制各列,默认使用当前列顺序
secondary_y=True 是否在原有坐标下建立次坐标轴,True,False
)
kind可选类别:
'box':箱线 'line':折线 'bar':柱形图 'barh':条形
'kde':密度图 'area':面积图 'pie':饼图 'hist':直方图
'density':密度图 'scatter':散点 'hexbin':
如果未指定xy,DataFrame将对象的索引用作X轴刻度标签,为每列绘制一条线,自动创建图例;
1箱线与面积图
df = pd.DataFrame(np.random.randint(1,10,(50,2)), columns=['A','B'])
df['C'] = np.random.choice(['red', 'blue'], size=50)
df.head()
A B C
0 8 6 blue
1 1 7 blue
2 1 3 red
3 8 4 red
4 6 9 blue
colors={'boxes': 'DarkGreen', 'whiskers': 'DarkOrange', 'medians': 'DarkBlue', 'caps': 'Gray'}:各位置颜色
df.plot.box(color=colors, sym='r+', vert=True, positions=[])
# 每列绘制一个箱线,sym是异常值样式, vert=True表示默认的竖向, positions可确定位置
df.boxplot():每列绘制一个箱线
df.boxplot(by=[分类序列1, 分类序列2]):每个序列根据分类(组合)绘制一个子图,几个列就有几个子图
df.boxplot(by=['C'])
df.groupby(['C']).boxplot():根据类别绘图,有几类就有几个子图(和上面相反)
2面积图
df.plot.area(stacked=True):默认是堆积的面积图
df[['A','B']].plot.area(stacked=True, color=plt.cm.Pastel1([0,1]))
3柱状图和条形图
df.plot.bar/barh(color=[], stacked=True):堆积列数据到一个X类别下,否则一个X类别下多条柱形
s.plot.bar/barh()
df.index = pd.date_range('2021-02-04',periods=50,freq='D')
df.head()
A B C
2021-02-04 8 6 blue
2021-02-05 1 7 blue
2021-02-06 1 3 red
2021-02-07 8 4 red
2021-02-08 6 9 blue
df1 = df.iloc[:10,:2]
fig,axes=plt.subplots(1,2, figsize=(6,4))
df1.plot.barh(ax=axes[0],color=plt.cm.Pastel1([0,1]), legend=False)
axes[0].set_yticks(list(range(len(df1))))
axes[0].set_yticklabels(df1.index.strftime('%m-%d'))
axes[0].set_ylabel(u'2021年',rotation='horizontal',y=0)
df1.plot.bar(stacked=True,ax=axes[1],color=plt.cm.Pastel1([0,1]), legend=False)
axes[1].set_xticks(list(range(len(df1))))
axes[1].set_xticklabels(df1.index.strftime('%m-%d'))
axes[1].set_xlabel(u'2021年', loc='right')
plt.legend(bbox_to_anchor=(1,0.8))
4直方图和密度图
【直方图】:
s/df.plot.hist(bins=10, stack=False, orientation='horizontal', cumulative=False):
直方图 分段数量 是否堆积 方向 是否累计
df.hist():为每列单独画一个图,上面的是画在一个图里
s.hist(by=分组序列):传入长度=s的分组序列,结果将分组成几个子图
【密度图】:
s/df.plot.kde()
s.plot.density():密度曲线图
sns.distplot(数据序列,bins=10,color='k'):直方图+密度图
import seaborn as sns
fig,axes = plt.subplots(2,2, figsize=(6,5))
df[['A','B']].plot.hist(stacked=True, color=plt.cm.Pastel1([0,1]), ax=axes[0,0], title=u'df堆积频率直方图')
axes[0,0].grid(axis='y', linewidth=0.3)
df['A'].plot.hist(orientation='horizontal', cumulative=True, color=plt.cm.Pastel1([0]), ax=axes[0,1], title=u'累计频率直方图',legend=False)
df[['A','B']].plot.kde(color=plt.cm.Pastel1([0,1]), ax=axes[1,0], title=u'df密度图kde')
axes[1,0].legend(loc='upper right')
sns.histplot(df['A'], bins=10, ax=axes[1,1])
axes[1,1].set_title(u'sns密度+直方图')
axes[1,1].legend(['A'],bbox_to_anchor=(1,0.8))
plt.subplots_adjust(hspace=0.38,wspace=0.35)
df.hist(column='A',by='C')
5散点图及矩阵
【散点图】:
df.plot.scatter(x='A',y='B',label='g1', c='C', cmap='autumn',s=df['C']*20)
c和cmap不同同时存在,设置c则表示根据数值大小颜色有深浅。
绘制两个/多个散点图:
ax = df.plot.scatter(颜色样式标签等)
df.plot.scatter(颜色样式标签等, ax=ax)
df.plot.scatter(颜色样式标签等, ax=ax)
...
sns.regplot('x数据','y数据',data='df'):散点图+线性回归的线,也可以没有data来源,只写两个序列
【散点矩阵】:
from pandas.plotting import scatter_matrix
scatter_matrix(df, diagonal='kde'):指定对角线图的类型
sns.pairplot(df,diag_kind='kde',plot_kws={'color':'','alpha':}):散点图矩阵,diag_kind指定对角线图形类别,plot_kws为非对角图的配置
-------------------------------------------------------------------
【散点图】:
df = pd.DataFrame(np.random.randn(1000, 3), columns=['a', 'b', 'c'])
fig,ax=plt.subplots(1,1)
df.plot.scatter(x='a',y='b',s=abs(df['b'])*20,ax=ax,color='#66CCFF',label='b')
plt.legend()
df.plot.scatter(x='a',y='c', s=abs(df['c'])*20,ax=ax,label='c',color='#FF99CC')
plt.legend()
plt.ylabel('b/c')
【散点矩阵】:
from pandas.plotting import scatter_matrix
scatter_matrix(df, diagonal='kde')
sns.pairplot(df, diag_kind='kde')
scatter_matrix(df, diagonal='kde')
sns.pairplot(df, diag_kind='kde')
6六边蜂箱图
适用于数据量大的情况, 类似散点图
df.plot.hexbin(x='col1', y='col2', gridsize=30):计算每对(x,y)值附近的点的数量
df.plot.hexbin(x='col1', y='col2', C='col3', reduce_C_function=函数, gridsize=30):以C中的值作为每对(x,y)对应的值,reduce_C_function应用于每个小区域的数据,得到一个标量,和C联用就是对'col3'的数据应用函数
df = pd.DataFrame(np.random.rand(360,360)+np.sin(np.linspace(-np.pi/4,(4/3)*np.pi,360)).reshape(1, 360).repeat(360, axis=0)*30,
columns=np.linspace(0, 180, 360), index=np.linspace(-90,90,360))
df.index.name='经度'
df.columns.name='纬度'
df = df.stack().reset_index()
df.columns = ['经度', '纬度', '温度']
df
经度 纬度 温度
0 -90.0 0.000000 -20.895695
1 -90.0 0.501393 -20.362729
2 -90.0 1.002786 -19.963455
3 -90.0 1.504178 -19.530852
4 -90.0 2.005571 -19.255508
... ... ... ...
129595 90.0 177.994429 -24.782752
129596 90.0 178.495822 -25.135172
129597 90.0 178.997214 -25.044194
129598 90.0 179.498607 -24.899114
129599 90.0 180.000000 -25.623183
fig,ax=plt.subplots(1,2, figsize=(12,5))
df.plot.hexbin(x='经度',y='纬度', gridsize=25,ax=ax[0])
df.plot.hexbin(x='经度',y='纬度',gridsize=25, C='温度', reduce_C_function=np.max,ax=ax[1])
7饼图
s.plot.pie(labels=[], colors=[], autopct='%.2f'或'%1.2%%'):类别为index,再根据值绘图
df.plot.pie(y='col1'):根据某一列绘图
df.plot.pie(subplots=True, legend=False):绘制全部列,取消图例
可使用小数表示百分比,如果和<1,饼图是不完整的
df = pd.DataFrame({'mass': [0.330, 4.87 , 5.97], 'radius': [2439.7, 6051.8, 6378.1]}, index=['Mercury', 'Venus', 'Earth'])
mass radius
Mercury 0.33 2439.7
Venus 4.87 6051.8
Earth 5.97 6378.1
df.plot.pie(subplots=True, figsize=(5, 5), colors=plt.cm.Pastel1([0,1,2]), legend=False)
plt.legend(df.index, bbox_to_anchor=(1,0.4),fontsize=8)
plt.subplots_adjust(wspace=0.4)
对于缺失值的处理
类型 处理
line 保留缺口
line(stacked) 填充0
bar 填充0
scatter 删除
histogram 删除(列向)
box 删除(列向)
area 填充0
kde 删除(列向)
hexbin 删除
pie 填充0