1. ホーム
  2. matplotlib

matplotlib の基本 1: プロットプロパティの基本設定 -- xticks(loc,labels) の書式設定 エスケープトークン

2022-02-22 03:56:36
<パス

matplotlibのプロットプロパティの基本的な設定。

  • 中国語のフォントを太字で表示するように定義する。
    plt.rcParams['font.sans-serif'] = ['SimHei'] とする。
  • 通常表示でネガティブサインを表示する際に使用します
    plt.rcParams['axes.unicode_minus'] = False
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 24 15:11:36 2018

@author: Administrator
"""

import numpy as np
import matplotlib.pyplot as plt


x = np.linspace(-np.pi, np.pi, 1000) # number of 1000 uniformly distributed endpoint=False
cos_y = np.cos(x) / 2
sin_y = np.sin(x)

# Initial values (x0,y0)
x0 = np.pi * 3 / 4 
x1 = -np.pi * 4 / 5
y0_cos = np.cos(x0) / 2
y1_sin = np.sin(x1)

# text content
text_cont = 'This is a test!

# Set the graphical object : window
plt.figure('Figure Object 1', # the name of the figure object is displayed in the top left corner of the window
           figsize = (8, 6), # window size
           dpi = 120, # resolution
           facecolor = 'lightgray', # background color
           )

# Set the axis boundaries xlim ylim
plt.xlim(x.min() * 1.1, x.max() * 1.1)
plt.ylim(sin_y.min() * 1.1, sin_y.max() * 1.1)

# Set the title
plt.title('Function Curve', fontsize=14)


# ************************ Coordinate axis scale: start *****************************
# Method 1: Set the scale value i.e. axis scale xticks yticks
plt.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4,
           np.pi],
          [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$',
           r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$',
           r'$\pi$'])
# formatting escapes string first and last r'$... $' (in matplotlib)
# xticks(loc, labels): labels formatting escape r'$-\frac{\pi}{2}$' Note the representation of fractions
# pi needs to be escaped to be displayed as pai. if $-pi$ then -pi is displayed directly
# Without the second [] argument, the scale value is displayed as -3.142, -1.571... etc., instead of -pi
plt.yticks([-1, -0.5, 0.5, 1]) # == ax.set_yticks([-1, -0.5, 0.5, 1])

# Method 2: Set the axis scale
# ax.set_yticks([-1, -0.5, 0.5, 1]) # Equivalent to plt.yticks([-1, -0.5, 0.5, 1])
# ax.set_xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4,
# np.pi],[r'$-\pi$', r'$-\frac{\pi}{2}$',r'$0$',
# r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$',#r'$\pi$']) # Show -3,-2,-1

# Get the current axis 
ax = plt.gca()

# Method 3: coordinate scale locator axis : ax.x[y]axis.set_major[minor]_locator(locator)
# Same function as (plt.xticks , plt.yticks) and (ax.set_xticks and ax.set_yticks)
# ax.yaxis.set_major_locator(plt.MaxNLocator(nbins=5, steps=[1, 3, 5, 7, 9])) # faceting 4 segments of data
# ax.yaxis.set_minor_locator(plt.MultipleLocator(0.5)) # subscale interval
'''Locator type.
        'plt.NullLocator()',
        MaxNLocator(nbins=5, steps=[1, 3, 5, 7, 9])', # nbin=5: the number of face element boundaries that 4 buckt steps do not know what it means
        FixedLocator(locs=[0, 2.5, 5, 7.5, 10])', # Specify the location of the scale value directly 
        'plt.AutoLocator()', # Automatically assign the scale value position
        'plt.IndexLocator(offset=0.5, base=1.5)', # face width (interval) 1.5, start from 0.5
        'plt.MultipleLocator()', # Free to customize the interval of the scale
        'plt.LinearLocator(numticks=21)', # Linear division into 20 equal parts, 21 ticks
        '''plt.LogLocator(base=2, subs=[1.0])'''] # Log locator
'''

# Set the scale parameters for the axes
plt.tick_params(labelsize=10) # NOTE: not fontsize, but labelsize
# ************************ Coordinate axis scale: end *****************************


# Move the axis: set the position of the zero point on the axis ,set_position(tuple) element to tuple
ax.spines['left'].set_position(('data',0)) # data means position is relative to the data coordinate system
ax.yaxis.set_ticks_position('left') # y-axis 'right': the scale value is displayed on the right axis
ax.spines['bottom'].set_position(('data',0))
ax.xaxis.set_ticks_position('bottom') # x-axis top:ticks values are displayed on the top axis

# Hide the top and right borders
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

plt.plot(x, cos_y,
         linestyle='-', 
         linewidth=2,
         color='dodgerblue', 
         label=r'$y=\frac{1}{2}$cos(x)') # r'$. $' does not need quotation marks outside

plt.plot(x, sin_y, 
         linestyle='-', # line type
         linewidth=2, # line width
         color='orangered', 
         label=r'$y=sin(x)$') # label: the content of the legend display

# set legend legend, can be set directly in the plt.plot label property, and then plt.lengend () display
# loc order: "top middle bottom, then left middle right" default top left, shadow default: False
plt.legend(loc='upper left',shadow=False, fontsize=12)

# grid grid parameters
plt.grid(color = 'y', linestyle=':', linewidth=1)

# scatter
plt.scatter([x0, x1],[y0_cos, y1_sin], # coordinates of two points
            s = 60, # fontsize
            edgecolor='limegreen', # scattered edge color
            facecolor='purple', # scatter fill color
            zorder=3 # Z-order, layer order
            )

# Line segment between two points
plt.plot([x0, x1],[y0_cos, y1_sin],
         linestyle='--',
         color='limegreen',
         alpha=0.4, # transparency 0~1
         marker='o', # dot style
         markersize=6 
         )

# Note text for point (x0,y0)
plt.annotate(
        r'$\frac{1}{2}cos(\frac{3\pi}{4}) = -\frac{\sqrt{2}}{4}$', # Remark text
        xy = (x0, y0_cos), # target position
        xycoords = 'data', # Target coordinate system: relative to the data coordinate system
        xytext = (-70, -35), # text position, offset, textcoords = 'offset points' relative to target
        textcoords = 'offset points', # offset of the coordinate system with respect to the target point as the origin
        fontsize = 14,
        arrowprops = dict(arrowstyle='->', # arrow style, '-|>' '->'
                          connectionstyle='arc3, rad=.2') # arrowprops
        )

# plt.text: Add text to the axes.
# Add the text s to the axes at location x, y in data coordinates
plt.text(-2,
         0.5, 
         'Content:%s' % text_cont, # text content , can be formatted
         fontsize = 10,
         ha='center', 
         va='center',
         alpha=0.5,
         color = 'r'
        )   

# Show image
plt.show()

'''
plot(*args, **kwargs)
    Plot y versus x as lines and/or markers.
    Call signatures:
        plot([x], y, [fmt], data=None, **kwargs)
        plot([x], y, [fmt], [x2], y2, [fmt2], ... , **kwargs)
'''



<イグ

注:使い方や書式に注意してください。
1. 書式付きエスケープライティングフォーマット

mp.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4,
           np.pi],
          [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$',
           r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$',
           r'$\pi$'])
# 格式化转义 字符串首尾 r'$...$') (matplotlib中)
# xticks(loc, labels): labels 格式化转义方法 r'$-\frac{\pi}{2}$'
# pi需要转义才能显示为字符 pai. 若$-pi$ 则直接显示-pi
# 如果没有第二个[]参数,刻度值显示如-3.142, -1.571...等浮点数,而不是-pi


2. ティックロケータとフォーマット (Tick Locator)
参考リンク matplotlib コマンドとフォーマット: 目盛軸の一次と二次スケール設定

プライマリースケール変数の定義

xmajorLocator = MultipleLocator(20) #将x主刻度标签设置为20的倍数
xmajorFormatter = FormatStrFormatter('%5.1f') #设置x轴标签文本的格式
ymajorLocator = MultipleLocator(0.5) #将y轴主刻度标签设置为0.5的倍数
ymajorFormatter = FormatStrFormatter('%1.1f') #设置y轴标签文本的格式


メインスケールラベルの位置と、ラベルテキストのフォーマットを設定する

ax.xaxis.set_major_locator(xmajorLocator)
ax.xaxis.set_major_formatter(xmajorFormatter)
ax.yaxis.set_major_locator(ymajorLocator)
ax.yaxis.set_major_formatter(ymajorFormatter)


サブスケールを変更する

xminorLocator = MultipleLocator(5) #将x轴次刻度标签设置为5的倍数
yminorLocator = MultipleLocator(0.1) #将此y轴次刻度标签设置为0.1的倍数


サブスケールラベルの位置を設定、ラベルテキストのフォーマットはなし

ax.xaxis.set_minor_locator(xminorLocator)
ax.yaxis.set_minor_locator(yminorLocator)


軸からスケールを削除する

ax.yaxis.set_major_locator(plt.NullLocator()) 
ax.xaxis.set_major_formatter(plt.NullFormatter()) 


日付形式を含むロケータの簡単な説明

ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO))
ax.xaxis.set_minor_locator(md.DayLocator())
ax.xaxis.set_major_formatter(md.DateFormatter('%d %b %Y'))


注1:
パイソン unterstützt nur :mod: datetime :func: strftime-Formatierung 1900年以上の年について

class DateFormatter(ticker.Formatter):
    """
    Tickposition ist Sekunden seit der Epoche.  Verwenden Sie einen :func:`strftime`
    Format-String.
    Python unterstützt nur :mod:`datetime` :func:`strftime` Formatierung
    für Jahre größer als 1900.  Dank an Andrew Dalke, Dalke
    Scientific Software, der den :func:`strftime` Code unten beigesteuert hat
    zur Verfügung gestellt hat, um Daten vor diesem Jahr einzubeziehen.
    """


NOTE2:
の要素 . のいずれかでなければなりません。 MO , TU . , WE . , TH , FR , SA ,
SU からの定数:mod: dateutil.rrule にインポートされています。 matplotlib.dates 名前空間を使用します。

class WeekdayLocator(RRuleLocator):
    """
    Kreuze an, wenn ein bestimmter Wochentag vorkommt.
    """
    def __init__(self, byweekday=1, interval=1, tz=None):
        """
        Markiert jeden Wochentag in *byweekday*; *byweekday* kann eine Zahl oder
        Folge sein.

        Die Elemente von *byweekday* müssen eines von MO, TU, WE, TH, FR, SA sein,
        SU, die Konstanten aus :mod:`dateutil.rrule`, die in die
        die in den Namensraum :mod:`matplotlib.dates` importiert wurden.

        *interval* gibt die Anzahl der zu überspringenden Wochen an.  Zum Beispiel,
        ``interval=2`` plottet jede zweite Woche.
        """


注3:
月別日 int または sequence . デフォルト

bymonthday=range(1,32)

ロケータ属性のタイプです。

class DayLocator(RRuleLocator):
    """
    Setzen Sie Häkchen beim Auftreten eines jeden Tages des Monats.  Zum Beispiel,
    1, 15, 30.
    """
    def __init__(self, bymonthday=None, interval=1, tz=None):
        """
        Markiert jeden Tag in *bymonthday*; *bymonthday* kann ein int oder eine
        Sequenz sein.

        Standardmäßig wird jeder Tag des Monats angekreuzt: ``bymonthday=range(1,32)``
        """


再掲。線と点のスタイル

'''locator类型:.
        '''plt.NullLocator()''',
        'plt.MaxNLocator(nbins=5, steps=[1, 3, 5, 7, 9])', # nbin=5:面元边界个数即4个buckt steps不知道啥意思
        'plt.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])', # 直接指定刻度值位置 
        'plt.AutoLocator()', # 自动分配刻度值位置
        'plt.IndexLocator(offset=0.5, base=1.5)', # 面元宽度(间隔)1.5,从0.5开始
        'plt.MultipleLocator()', # 可以自由自定刻度间隔
        'plt.LinearLocator(numticks=21)', # 线性划分20等分,21个刻度
        'plt.LogLocator(base=2, subs=[1.0])']                # 对数定位器
'''