python 可视化笔记

作者: 何老板 | 来源:发表于2018-01-13 16:41 被阅读386次

    一.pandas包里内置的绘图函数

    matplotlib.style.use('ggplot')#调用风格ggplot
    

    1. plot() :最基本的绘图函数

    例子1,Series数据:

    ts = pd.Series(np.random.randn(1000),index = pd.date_range('2000-1-1',periods=1000))
    ts.plot()
    ts=ts.cumsum()
    ts.plot()
    

    例子2,DataFrame数据:

    ds = pd.DataFrame(np.random.randn(1000,4),index = ts.index , columns = list('ABCD'))
    df = ds.cumsum()
    plt.figure();df.plot();
    

    2. plot.bar() # 条形图

    有两种写法:
    df.plot(kind = 'bar')
    或者
    df.plot.bar()


    最简单的条形图
    df2 = pd.DataFrame(np.random.rand(10,4),columns=list('abcd'))
    df2.plot.bar();
    
    分类别对比的条形图

    堆积条形图:

    df2 = pd.DataFrame(np.random.rand(10,4),columns=list('abcd'))
    df2.plot.bar(stacked = True );
    
    堆积条形图

    水平放置的条形图(horizontal bar plot):

    df2.plot.barh()#非堆积
    df2.plot.barh(stacked = True );#堆积
    
    水平放置的堆积条形图(horizontal bar plot)

    3. plot.hist() #(分布)直方图

    PS: 注意条形图(bar)与直方图(hist)的区别

    df4 = pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),
                        'c':np.random.randn(1000)-1},
                        columns = list('abc'))
    plt.figure();
    df4.plot.hist(alpha=0.5 )
    
    分布直方图,alpha=0.5
    堆积直方图:
    df4.plot.hist(stacked=True ,bins = 20 )
    
    堆积直方图
    水平放置的堆积直方图:
    df4.plot.hist(orientation = 'horizontal')
    水平放置,累计直方图:
    df4.plot.hist(orientation = 'horizontal',cumulative = True)
    
    水平放置的堆积直方图 水平放置,累计直方图
    DataFrame.hist 可以绘制多个直方图的组合图(区别于plot.hist):
    df.diff().hist(color='k',alpha = 0.5,bins = 50)
    #df.diff函数是用来将数据进行某种移动之后与原数据进行比较得出的差异数据。
    
    DataFrame.hist绘制的组合直方图 对比:plot.hist()绘制的并不是组合直方图

    4. plot.box() 箱线图

    箱线图可以使用Series.plot.box() 和DataFrame.plot.box(),或DataFrame.boxplot()来绘制。

    df = pd.DataFrame(np.random.rand(10,5),columns=list('abcde'))
    df.plot.box()
    
    箱线图

    利用dict输入颜色,指定图表元素的颜色:

    colordict = dict(boxes = 'DarkGreen',whiskers = 'DarkOrange',medians = 'DarkBlue',caps ='Gray')
    df.plot.box(color = colordict,sym = 'r+')#异常点使用红色的+
    
    指定图表元素的颜色,及异常点的符号

    水平放置的箱线图,以及调整箱线图的位置:

    df.plot.box(vert = False , positions = [1,4,5,6,8])
    
    水平放置的箱线图,以及调整箱线图的位置

    使用DataFrame.boxplot绘制分组箱线图:

    df = pd.DataFrame(np.random.rand(10,2) ,columns = ['col1','col2'])
    df['X'] =pd.Series(['A','A','A','A','A','B','B','B','B','B'])
    plt.figure();
    bp = df.boxplot(by='X')
    
    分组箱线图(使用DataFrame.boxplot绘制)

    也可以根据多列进行分组。
    如以下的数据,根据 ['X','Y'] 分组:

           col1      col2      col3  X  Y
    0  0.779948  0.547248  0.010448  A  A
    1  0.894880  0.934884  0.952019  A  B
    2  0.590233  0.723640  0.849273  A  A
    3  0.624342  0.128476  0.663999  A  B
    4  0.721439  0.362377  0.625264  A  A
    
    df = pd.DataFrame(np.random.rand(10,3) ,columns = ['col1','col2','col3'])
    df['X'] =pd.Series(['A','A','A','A','A','B','B','B','B','B'])
    df['Y'] =pd.Series(['A','B','A','B','A','B','A','B','A','B'])
    plt.figure();
    bp = df.boxplot(column = ['col1','col2'],by=['X','Y'])
    
    根据多列分组的箱线图

    以下两种写法相等:

    df_box = pd.DataFrame(np.random.randn(50,2))
    df_box['g'] = np.random.choice(['A','B'],size = 50)
    df_box.loc[df_box['g'] == 'B',1] +=3
    
    bp = df_box.boxplot(by='g')            #DataFrame.boxplot(by=)
    
    df_box.groupby('g').boxplot()          #Groupby.boxplot()
    

    5. plot.area(): 面积图

    df = pd.DataFrame(np.random.rand(10,4),columns = list('abcd'))
    df.plot.area()#堆积面积图
    df.plot.area(stacked = False) #不堆积
    
    堆积面积图(默认为堆积) 不堆积面积图,默认alpha值为0.5

    6. plot.scatter(): 散点图

    df = pd.DataFrame(np.random.rand(50,4),columns = list('abcd'))
    df.plot.scatter(x='a',y='b')
    
    散点图

    由于这个df数据没有分类列,如果要绘制分类散点图,代码逻辑比较特殊,

    1. 要先绘制一个普通散点图(举例s1);
    2. 然后再绘制第二次,在绘制第二次的时候把散点图s1赋值参数ax 。

    (另外以下两句代码要一次运行,如分开运行只会返回<matplotlib.axes._subplots.AxesSubplot at 0x1beebfd4b38>,而不会显示图像。)

    s1 = df.plot.scatter(x='a',y='b',color='DarkBlue',label='Group 1')
    df.plot.scatter(x='c',y='d',color='Red',label='Group 2',ax=s1)
    
    分类散点图
    df.plot.scatter(x='a',y='b',c='c',s=50)#参数s指定散点大小为50
    
    给c赋值,根据c值填充颜色

    给参数s赋值可以绘制气泡图:

    df.plot.scatter(x='a',y='b',s=df['c']*200)
    
    气泡图

    7. plot.hexbin(): 六边形图(本质上类似热点图)

    df = pd.DataFrame(np.random.randn(1000,2),columns = list('ab'))
    df['b'] = df['b'] + np.arange(1000)
    df.plot.hexbin(x='a',y='b',gridsize=25)
    
    六边形图,gridsize=25

    gridsize参数值越大,六边形块越小。


    六边形图,gridsize=100

    默认条件下,每一个六边形会统计(x,y)周围的count值。可以通过赋值给C和reduce_C_function,指定替代的聚合函数、值。
    举例,下图展示的是每一个(a,b)坐标,对应Z值的最大值。

    df['b'] = df['b'] = df['b']+np.arange(1000)
    df['z'] = np.random.uniform(0,3,1000)
    df.plot.hexbin(x='a',y='b',C='z',reduce_C_function=np.max,gridsize =25)
    
    hebin颜色表示z列最大值

    8. plot.pie(): 饼图

    series = pd.Series(3* np.random.rand(4),index = list('abcd'),name='series')
    series.plot.pie(figsize=(6,6))
    
    用Series作的单个饼图
    de = pd.DataFrame(3*np.random.rand(4,2),index = list('abcd'),columns=['x','y'])
    #de有x,y两列数据(4×2)
    de.plot.pie(subplots = True, figsize =(8,4))
    
    de = pd.DataFrame(3*np.random.rand(4,3),index = list('abcd'),columns=['x','y','z'])
    #de有x,y,z三列数据(4×3),会绘制出三个饼
    de.plot.pie(subplots = True, figsize =(12,4))
    
    用含x,y两列数据的DF作饼图,根据各列单独绘制两个饼
    绘制三个饼
    series.plot.pie(labels=['AA','BB','CC','DD'],colors=['r','g','b','c'],autopct='%.2f',fontsize=20,figsize=(6,6))
    
    添加标签,指定颜色,以及设定字体大小,数字小数点位置

    9. scatter_matrix(): 散点矩阵图

    from pandas.tools.plotting import scatter_matrix
    df = pd.DataFrame(np.random.randn(1000,4),columns=list('abcd'))
    scatter_matrix(df,alpha=0.2,figsize=(10,10),diagonal='kde')
    
    散点矩阵图

    10. kde(): 密度图(Kernel Density Estimate plot)

    又名:核密度估计图

    ser = pd.Series(np.random.randn(1000))
    ser.plot.kde()
    
    核密度图

    二.修改绘图格式(Plot Formatting)

    1.图例

    df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))
    df=df.cumsum()
    df.plot(legend=False) --关闭图例:legend=False
    df.plot() -- 默认显示图例
    

    2.坐标轴

    ts = pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods = 1000))
    ts = np.exp(ts.cumsum())
    ts.plot(logy=True)#Y轴进行log转化
    

    另外还有,logx和loglog参数;

    3.绘制次要Y轴:secondary_y=True

    df = pd.DataFrame(np.random.randn(1000,4),columns=list('ABCD'))
    df['A'] = df['A'].cumsum()
    df['B'] = df['B'].cumsum()
    df.A.plot()
    df.B.plot(secondary_y=True,style='g')
    
    把B列数据绘制在次要y轴上
    df['C'] = df['C'].cumsum()
    df['D'] = df['D'].cumsum()
    plt.figure()
    ax = df.plot(secondary_y = ['A','B'])
    ax.set_ylabel('CD scale')#设置左边y轴名称
    ax.right_ax.set_ylabel('AB scale')#设置右边次要y轴名称
    
    设置左右y轴名称
    plt.figure()
    df.plot(secondary_y=['A', 'B'], mark_right=False)#mark_right=False
    
    mark_right=False,标签上不标记right

    4. Suppressing Tick Resolution Adjustment

    对于X轴的时间标签,pandas多数情况下不能判断X轴的出现频率,所以可以使用x-axis tick labelling(X轴加标签的方法)来全部显示X轴内容
    Using the x_compat parameter, you can suppress this behavior:
    设定参数就是x_compat=True


    默认情况下,df.A.plot() df.A.plot(x_compat=True)

    如果需要处理多个图像:
    If you have more than one plot that needs to be suppressed, the use method in pandas.plot_params can be used
    in a with statement:

    with pd.plot_params.use('x_compat', True):
        df.A.plot(color='r')
        df.B.plot(color='g')
        df.C.plot(color='b')
    
    pd.plot_params.use()处理多个plot

    5.多图绘制(相当于在ggplot2中的分面画图)

    df.plot(subplots=True, figsize=(10, 10));
    
    分面绘图

    相关文章

      网友评论

        本文标题:python 可视化笔记

        本文链接:https://www.haomeiwen.com/subject/rgbcoxtx.html