使用matplotlib在X轴上添加矩阵

时间:2015-07-18 07:59:34

标签: python matrix matplotlib

我尝试使用matplotlib在X轴上添加矩阵。 我写的代码是:

#!/bin/python

import sys
import numpy as np
import math
import decimal 
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab 
from matplotlib import rcParams

def plot():           
    N = 6
    ind = np.arange(N)
    ind_label = ['1X', '2X' , '3X' , '4X', '5X', '6X']

    y = [1.60, 1.65, 1.70, 1.75, 1.80]
    m1 = [1.62, 1.64, 1.64, 1.71, 1.7, 1.68]
    m2 = [1.61 , 1.7, 1.7, 1.8, 1.75, 1.75]
    m3 = [1.63 , 1.69, 1.7, 1.67, 1.64, 1.61]

    width = 0.2

    fig = plt.figure()
    ax = fig.add_subplot(111)

    rec_m1 = ax.bar(ind, m1, width, color='r', align='center')
    rec_m2 = ax.bar(ind+width, m2, width, color='g', align='center')
    rec_m3 = ax.bar(ind+width*2, m3, width, color='b', align='center')

    ax.set_ylabel('Value',fontsize=20)
    ax.set_xlabel('Matrix', fontsize=20)
    ax.tick_params(axis='both', labelsize=17)
    ax.set_xticks(ind+width)
    ax.set_xticklabels(ind_label, fontsize=18)
    ax.axis([-0.2, 5.6, 1.58, 1.82])

    ax.legend((rec_m1[0],rec_m2[0],rec_m3[0]),('Method 1','Method 2','Method 3'), loc="upper right",shadow=True)

    plt.grid()
    plt.tight_layout()
    plt.show()

if __name__ == '__main__':
    plot()

目前的输出数字是: http://i.stack.imgur.com/DJVxA.png

然而,最痛苦的部分是添加X标签。 我在图中显示了预期的输出。 http://i.stack.imgur.com/b6h3U.png

我尝试了这篇文章How to display a matrix in the Matplotlib annotations中提到的方法。

但它在我的情况下不起作用。任何帮助或想法将不胜感激。 非常感谢!

1 个答案:

答案 0 :(得分:1)

你几乎在那里;使用您问题中提供的链接,您可以按如下方式解决:

ax.set_xticklabels([r"$\left[ \begin{array}{cc} 0 & 1 \\ 1 & 0 \end{array}\right]$",
                    r"$\left[ \begin{array}{cc} 0 & 1 \\ 5 & 0 \end{array}\right]$",
                    r"$\left[ \begin{array}{cc} 0 & 1 \\ 10 & 0 \end{array}\right]$",
                    r"$\left[ \begin{array}{cc} 0 & 1 \\ 30 & 0 \end{array}\right]$",
                    r"$\left[ \begin{array}{cc} 0 & 1 \\ 50 & 0 \end{array}\right]$",
                    r"$\left[ \begin{array}{cc} 0 & 1 \\ 100 & 0 \end{array}\right]$"])

总代码变为:

#!/bin/python

import sys
import numpy as np
import math
import decimal
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
from matplotlib import rcParams

def plot():
    N = 6
    ind = np.arange(N)
    ind_label = ['1X', '2X' , '3X' , '4X', '5X', '6X']

    y = [1.60, 1.65, 1.70, 1.75, 1.80]
    m1 = [1.62, 1.64, 1.64, 1.71, 1.7, 1.68]
    m2 = [1.61 , 1.7, 1.7, 1.8, 1.75, 1.75]
    m3 = [1.63 , 1.69, 1.7, 1.67, 1.64, 1.61]

    width = 0.2

    rcParams['text.usetex'] = True
    fig = plt.figure()
    ax = fig.add_subplot(111)

    rec_m1 = ax.bar(ind, m1, width, color='r', align='center')
    rec_m2 = ax.bar(ind+width, m2, width, color='g', align='center')
    rec_m3 = ax.bar(ind+width*2, m3, width, color='b', align='center')

    ax.set_ylabel('Value',fontsize=20)
    ax.set_xlabel('Matrix', fontsize=20)
    ax.tick_params(axis='both', labelsize=17)
    ax.set_xticks(ind+width)
    ax.set_xticklabels(ind_label, fontsize=18)
    ax.axis([-0.2, 5.6, 1.58, 1.82])

    ax.legend((rec_m1[0],rec_m2[0],rec_m3[0]),('Method 1','Method 2','Method 3'), loc="upper right",\
shadow=True)
    ax.set_xticklabels([r"$\left[ \begin{array}{cc} 0 & 1 \\ 1 & 0 \end{array}\right]$",
                        r"$\left[ \begin{array}{cc} 0 & 1 \\ 5 & 0 \end{array}\right]$",
                        r"$\left[ \begin{array}{cc} 0 & 1 \\ 10 & 0 \end{array}\right]$",
                        r"$\left[ \begin{array}{cc} 0 & 1 \\ 30 & 0 \end{array}\right]$",
                        r"$\left[ \begin{array}{cc} 0 & 1 \\ 50 & 0 \end{array}\right]$",
                        r"$\left[ \begin{array}{cc} 0 & 1 \\ 100 & 0 \end{array}\right]$"])
    ax.xaxis.set_tick_params(pad=15)

    plt.grid()
    plt.tight_layout()
    plt.show()

if __name__ == '__main__':
    plot()

一些注意事项:

  • 您的系统需要LaTeX。

  • 这可能需要一段时间才能渲染:这是因为Matplotlib的开发是为了创建高质量的图,以及每个标签下面的额外LaTeX渲染。

  • 我使用xaxis.set_tick_params(pad=15)来偏移刻度标签,因为矩阵周围的方括号,刻度标签最终位于图中

  • 它们可能是改变字体大小或使用的LaTeX字体的方式(例如使用更多rcParams)。

结果是:

enter image description here