python 可视化笔记

一.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));
分面绘图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容