python 可视化:fig, ax = plt.subplots()画多表图的3中常见样例 & 自定义图表格式

转载于:https://blog.csdn.net/htuhxf/article/details/82986440

一、fig, ax = plt.subplots()的作用?

它是用来创建 总画布/figure“窗口”的,有figure就可以在上边(或其中一个子网格/subplot上)作图了,(fig:是figure的缩写)。

fig = plt.figure()
ax = plt.subplot(231)
ax = plt.subplot(232)
ax = plt.subplot(233)
ax = plt.subplot(234)
ax = plt.subplot(235)
ax = plt.subplot(236)

二、参数的含义?

首先看 fig = plt.figure()

matpltlib.pyplot.figure(
num = None,               # 设定figure名称。系统默认按数字升序命名的figure_num(透视表输出窗口)e.g. “figure1”。可自行设定figure名称,名称或是INT,或是str类型;
figsize=None,             # 设定figure尺寸。系统默认命令是rcParams["figure.fig.size"] = [6.4, 4.8],即figure长宽为6.4 * 4.8;
dpi=None,                 # 设定figure像素密度。系统默命令是rcParams["sigure.dpi"] = 100;facecolor=None,           # 设定figure背景色。系统默认命令是rcParams["figure.facecolor"] = 'w',即白色white;
edgecolor=None, frameon=True,    # 设定要不要绘制轮廓&轮廓颜色。系统默认绘制轮廓,轮廓染色rcParams["figure.edgecolor"]='w',即白色white;
FigureClass=<class 'matplotlib.figure.Figure'>,   # 设定使不使用一个figure模板。系统默认不使用;clear=False,                     # 设定当同名figure存在时,是否替换它。系统默认False,即不替换。        
** kwargs)  

然后看ax = plt.subplot()

三、怎么在一个图上排列多个子图?

<u style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word;">比如说我们想画个2*2的子图,每个子图对应一个表。</u>

  • 先重点考虑2个步骤。

· 第1个步骤:创建多维窗口:

fig, axes = plt.subplots(2, 2)  # 此处是一个2*2的图

· 第2个步骤:设定各个透视子图在窗口的位置:

data.plot.bar(ax=axes[1,1], color='b', alpha=0.5)  # ax=[1,1] 即位置是第2行、第二列。(python从0开始计数,所以“1”代表第2的) 
data.plot.barh(ax=axes[0,1], color='k', alpha=0.5) # alpha:设定图表的透明度;
  • 再添加子透视图代码。

· 第3个步骤:得到完整的代码:

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt 
fig, axes = plt.subplots(2, 2) 
data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop')) 
data.plot.bar(ax=axes[1,1], color='b', alpha = 0.5)
data.plot.barh(ax=axes[0,1], color='k', alpha=0.5) plt.show()
image

四、怎么把多个子图一起合并到一个图上?

最主要的一点是让多个图线共用一个x坐标轴。

  • 语句规定N个折线图共用一个x坐标(注意:y轴分主副轴):

import numpy as np
import matplotlib.pyplot as plt
 
fig, ax1 = plt.subplots(1, 1)             # 做1*1个子图,等价于 " fig, ax1 = plt.subplot() ",等价于 " fig, ax1 = plt.subplots() "
 
ax2 = ax1.twinx()                         # 让2个子图的x轴一样,同时创建副坐标轴。
 
# 作y=sin(x)函数
x1 = np.linspace(0, 4 * np.pi, 100)
y1 = np.sin(x1)
ax1.plot(x1, y1)
 
#  作y = cos(x)函数
x2 = np.linspace(0, 4 * np.pi, 100)       # 表示在区间[0, 4π]之间取100个点(作为横坐标,“线段是有无数多个点组成的”)。
y2 = np.cos(x2)
ax2.plot(x2, y2)
 
plt.savefig('sin_cos_2.png')               # 将窗口另存为png格式图片
image

<u style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word;">如果需要主副y轴都一样:就把ax1和ax2它俩用ax一个取代了。</u>

  • 自定义图表样式:比如旋转x轴标签、上边和右边的坐标轴不显示、曲线和y轴对齐

import matplotlib.pyplot as plt
 
plt.rcParams['font.family'] = ['SimHei']              # 解决不能输出中文的问题。不区分大小写,即SimHei’效果等价于‘simhei’,中括号可以不要
plt.rcParams['figure.autolayout'] = True              # 解决不能完整显示的问题(比如因为饼图太大,显示窗口太小)
  
fig, ax = plt.subplots(1, 1, figsize=(12, 9))         # 进一步设定fig的size为12*9
 
ax.spines['top'].set_visible(False)                   # 不显示图表框的上边框
ax.spines['right'].set_visible(False)                 # 不显示图表框的右边框
 
ax.set_xlim(0, 10)                                    # 有时候x轴不会从0显示,使得折线图和y轴有间隙
ax.set_ylim(0, 1.3e8)                                 # 和x轴同理
 
plt.xticks(range(0, 10), fontsize=12, rotation=80)    # 针对x轴的标签,指定我们想要设定的范围是(0, 10), 字体大小是12, 逆时针旋转80°
 
plt.tick_params(bottom='off', left='off', labelbottom='on', lableleft='on')  # 使x轴和y轴不带比例标识点, labelbottom设定下边、即x轴的标签是否显示。
 
< blabla... >
 
plt.suptitle('自定义图表', fontsize=400, ha='center')  # 即标题在x轴和y轴形成的方框内部,如下图(详细用法见下注释)。如果需要标题在这上方,使用 plt.title(blabla)            
plt.show()

"""
对于multiple subplots一般情况下,
1)设置 plt.xticks(range(0, 10))只会对最后一个ax起作用。要想作用于所有subplots,要这样:
for ax in axes:
    ax.set_xticks(range(0, 10))
2)标题:显示中文方面-在各个子图上要这样:
plt.title('某个子图的中文title', fontproperties='simhei'),
因为plt.rcParams['font.family'] = 'simhei' 只对整体的标题是有效的。
整体的标题要这样设置:
plt.suptitle(‘全体子图的中文title’)
3)xticks的旋转方面。例如上面的主副坐标轴的共x轴,要这样:
ax1.set_xticklabels(['str format labels'], rotation=80)
而这样的设置无效:plt.xticks(x, rotation=80)。
"""
image

注:


matplotlib.pyplot.suptitle(
t,                          # text缩写。即标题文字。
fontsize | size,            # 设定字体大小。
x,                          # 设定标题相对于x轴的位置,默认是'0.5'。
y,                          # 设定标题相对于y轴的位置,默认是'0.98'。
ha | horizontalalignment,   # 和参数x一起使用,设定标题水平方位,默认是‘center’。共3个可选值{'center', 'left', right'}。
va | verticalalignment,     # 和参数y一起使用,设定标题垂直方位, 默认是'top'。共4个可选值{'top', 'center', 'bottom', 'baseline'}。
fontweight | weight         # 设定字体权重。
)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351