11

ラジアル軸の開始をオフセットしたり、グラフの外に移動したりすることは可能ですか?

これは私が達成したいと思っていることです:

ゴール

そして、これが私が今持っているものです。

キュレス

SOに関するドキュメントとさまざまなトピックを読みましたが、役立つものは何も見つかりませんでした。それは、どこにも言及されていなければ、それも不可能だということですか。

前もって感謝します。

編集(プロットの作成に使用されるコードのスニペットを追加):

ax = fig.add_subplot(111, projection='polar')
ax.set_theta_zero_location('N')
ax.set_theta_direction(-1)      
ax.plot(X,lines[li]*yScalingFactor,label=linelabels[li],color=color,linestyle=ls)
4

2 に答える 2

7

放射軸の始点をオフセットするには:

編集: Matplotlib 2.2.3 の時点で、set_roriginまさにそれを行う新しい Axes メソッドが呼び出されています。原点の理論的な半径座標で呼び出します。したがって、 と を呼び出すax.set_ylim(0, 2)ax.set_rorigin(-1)、中心円の半径はプロットの半径の 3 分の 1 になります。

Matplotlib < 2.2.3 の簡単で汚い回避策は、放射軸の下限を負の値に設定し、円の背後にあるプロットの内側部分を非表示にすることです。

import numpy as np
import matplotlib.pyplot as plt

CIRCLE_RES = 36 # resolution of circle inside
def offset_radial_axis(ax):
    x_circle = np.linspace(0, 2*np.pi, CIRCLE_RES)
    y_circle = np.zeros_like(x_circle)
    ax.fill(x_circle, y_circle, fc='white', ec='black', zorder=2) # circle
    ax.set_rmin(-1) # needs to be after ax.fill. No idea why.
    ax.set_rticks([tick for tick in ax.get_yticks() if tick >= 0])
    # or set the ticks manually (simple)
    # or define a custom TickLocator (very flexible)
    # or leave out this line if the ticks are fully behind the circle

プロットの外側にスケールを追加するには:

他の軸の上半分に追加の軸オブジェクトを追加して、その yaxis を使用できます。

X_OFFSET = 0 # to control how far the scale is from the plot (axes coordinates)
def add_scale(ax):
    # add extra axes for the scale
    rect = ax.get_position()
    rect = (rect.xmin-X_OFFSET, rect.ymin+rect.height/2, # x, y
            rect.width, rect.height/2) # width, height
    scale_ax = ax.figure.add_axes(rect)
    # hide most elements of the new axes
    for loc in ['right', 'top', 'bottom']:
        scale_ax.spines[loc].set_visible(False)
    scale_ax.tick_params(bottom=False, labelbottom=False)
    scale_ax.patch.set_visible(False) # hide white background
    # adjust the scale
    scale_ax.spines['left'].set_bounds(*ax.get_ylim())
    # scale_ax.spines['left'].set_bounds(0, ax.get_rmax()) # mpl < 2.2.3
    scale_ax.set_yticks(ax.get_yticks())
    scale_ax.set_ylim(ax.get_rorigin(), ax.get_rmax())
    # scale_ax.set_ylim(ax.get_ylim()) # Matplotlib < 2.2.3

すべてを一緒に入れて:

(この例は、Matplotlib polar plot demoから取得したものです)

r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r

ax = plt.subplot(111, projection='polar')
ax.plot(theta, r)
ax.grid(True)

ax.set_rorigin(-1)
# offset_radial_axis(ax) # Matplotlib < 2.2.3
add_scale(ax)

ax.set_title("A line plot on an offset polar axis", va='bottom')
plt.show()

ここに画像の説明を入力

于 2018-09-14T18:51:12.613 に答える