[英]How to rotate tick labels in polar matplotlib plot?
I have long identifiers and I would like to make a radial plot where ticks are all at different angles. 我有很长的标识符,我想做一个径向图,刻度线都在不同的角度。 For example, the first tick on the right at 0 degrees should have a 0 degree angle. 例如,右侧0度处的第一个刻度应具有0度角。 The one at the top should be 90 degrees. 顶部的角度应为90度。 The one at 270 degrees on the left should be 0 degrees. 左侧270度的角度应为0度。 I want it to look reminiscent of a radial dendrogram. 我希望它看起来像是径向树状图。 Using matplotlib 2.0.2
and python 3.6.2
使用matplotlib 2.0.2
和python 3.6.2
Is this possible in matplotlib to rotate individual tick labels or add text labels separately? 在matplotlib中是否可以旋转单独的刻度标签或单独添加文本标签?
Setting ax.set_rticks([])
distorts the plot when adding the scatter points and lines. 设置ax.set_rticks([])
会在添加散点和线时使图变形。 The positions from label.get_position()
offset the labels considerably to the right of the plot. label.get_position()
的位置使标签大大偏离了绘图的右侧。
Is there a way use the angle and amplitude coordinates? 有没有一种使用角度和幅度坐标的方法?
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data = {'0-b__|ce0Ji|aaaiIi9abGc_|ti5l-baa1tcciii|irGi': 0.28774963897009614, '0-b__|ce0Ji|aaaiIi9abGc_|ti6l-baa1tcciii|irGi': 0.18366735937444964, 'allb_e__|tla1a|ali|_auc7en_|e': -0.11720263463773731, 'b__0|lp|..ii80p.e7l_|an4obln.llll0ai|': -0.021168680215561269, 'b__Ass8._ii8.c4on|Ay|mbessoxiAxa': 0.17845443978725653, 'b__Bts4o_rrtiordae|Bei|obe7rattrniBno': 0.32077066676059313, 'b__|aaa|tteiatlim_|e1rblttaaeei|e': -0.27915536613715614, 'b__|as4.|ei2.l7ov_|e0tblaaoxi|xa': 0.43309499489274772, 'b__|as4.|ei2.l7ov_|e9tblaaoxi|xa': 0.47835581698425556, 'b__|cu|ppripcae_|co2tbopnccpei|': -0.20330386390053184, 'b__|eoea|cccimacnuuh_|ra0obarceenbi|ba': 0.062889648127927869, 'b__|oa|ggrigoip_|nr6ybmgvoohii|i': -0.045648268817583035, 'b__|p1|ooiioi4rs_|sr5eba0otsoi|ox': -0.52544820541720971, 'b__|paa|piatgn_|hy1cboippoli|la': 0.27260399422352155, 'b__|triu|mmriumay_|eb4ebcimrttnhi|hc': 0.62680074671550845, 'b__|tru|mmriumad_|eb2obcmittisi|': 0.34780388151174668, 'etob_m__|aol2l|ooeui|_lool7r': 0.4856468599203973, 'etpb_s__|apl2l|lleni|_loll8e': 0.24430277200521291, 'ib__rCalc_hhdiorchubai|CSt|absahodrsiCsaaca': -0.13484907188897891, 'nlab___|oa1i|ssni|_iesa9': 0.13636363636363635, 'nlnb_i__|dn1t|rrnfi|_tera8ig_|e': -0.056954668733049205, 'nrfb_h__|afl3r|ssnti|_resl3yn_': 0.56102285935683849, 'o5b__l|rcoa|eecialaeprh_|as1o5bie0trrnlii|irLa': 0.53377831002782572, 'oelb_a__Aelt3_rrovi__rro|a': 0.32230284245007218, 'oelb_a__Aelt4_rrovi__rro|a': 0.16580958754534889, 'porb_i__Ctrc6c_oopci__cloa|ny|C': 0.38260364199922509, 'porb_i__Ctrc7g_rrpci__glra|ay|C': 0.51829805219964076, 'ptab_a__|hac2b|uupci|_boui3ct_|': 0.50873516255151285, 'reab_a__|aa2a|rrrhi|_axrl4ra_|': -0.47742242259871087, 'sb__o|sSac|ccnibocsctlhd_|a0dbuacmssioai|anCca': 0.42733612764608503, 'teob___|oa1b|iiti|_bnil3': -0.32684653587404461, 'uoib_i__|ia2a|bbuli|_arbi2it': -0.13636363636363635}
Se_corr = pd.Series(data, name="correlation")
def plot_polar(r):
with plt.style.context("seaborn-whitegrid"):
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111, polar=True)
ax.set_rmax(2)
# ax.set_rticks([])
ticks= np.linspace(0, 360, r.index.size + 1) [:-1]
ax.set_xticks(np.deg2rad(ticks))
ax.set_xticklabels(r.index, fontsize=15,)
angles = np.linspace(0,2*np.pi,len(ax.get_xticklabels()))
angles[np.cos(angles) < 0] = angles[np.cos(angles) < 0] + np.pi
angles = np.rad2deg(angles)
for i, theta in enumerate(angles):
ax.plot([theta,theta], [0,r[i]], color="black")
ax.scatter(x=theta,y=r[i], color="black")
labels = []
for label, theta in zip(ax.get_xticklabels(), angles):
x,y = label.get_position()
lab = ax.text(x, y, label.get_text(), transform=label.get_transform(),
ha=label.get_ha(), va=label.get_va())
lab.set_rotation(theta)
labels.append(lab)
ax.set_xticklabels([])
return fig, ax
fig,ax = plot_polar(Se_corr)
Rotating the ticklabels for a polar plot may be not as easy as for a usual cartesian plot. 旋转极坐标图的刻度标签可能不像通常的笛卡尔图那样容易。 For a cartesian plot, one can simply do something like 对于笛卡尔图,可以简单地做
for label in ax.get_xticklabels():
label.set_rotation(...)
This does not work for a polar plot, because their rotation is reset at draw time to 0 degrees. 这不适用于极坐标图,因为在绘制时将其旋转重置为0度。
One option that comes to mind is to create new ticklabels as additional text objects which copy the attributes of the ticklabels but can have a persistent rotation. 我想到的一种选择是创建新的刻度标签作为其他文本对象,这些对象复制刻度标签的属性,但可以持续旋转。 Then remove all original ticklabels. 然后删除所有原始的滴答标签。
import numpy as np
import matplotlib.pyplot as plt
r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r
ax = plt.subplot(111, projection='polar')
ax.plot(theta, r)
ax.set_rmax(2)
ax.set_rticks([])
plt.gcf().canvas.draw()
angles = np.linspace(0,2*np.pi,len(ax.get_xticklabels())+1)
angles[np.cos(angles) < 0] = angles[np.cos(angles) < 0] + np.pi
angles = np.rad2deg(angles)
labels = []
for label, angle in zip(ax.get_xticklabels(), angles):
x,y = label.get_position()
lab = ax.text(x,y, label.get_text(), transform=label.get_transform(),
ha=label.get_ha(), va=label.get_va())
lab.set_rotation(angle)
labels.append(lab)
ax.set_xticklabels([])
plt.show()
For longer labels you may play with the y
coordinates of the labels: 对于更长的标签,您可以使用标签的y
坐标:
import numpy as np
import matplotlib.pyplot as plt
r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r
ax = plt.subplot(111, projection='polar')
ax.plot(theta, r)
ax.set_rmax(2)
ax.set_rticks([])
ticks= np.linspace(0,360,9)[:-1]
ax.set_xticks(np.deg2rad(ticks))
ticklabels = ["".join(np.random.choice(list("ABCDE"),size=15)) for _ in range(len(ticks))]
ax.set_xticklabels(ticklabels, fontsize=10)
plt.gcf().canvas.draw()
angles = np.linspace(0,2*np.pi,len(ax.get_xticklabels())+1)
angles[np.cos(angles) < 0] = angles[np.cos(angles) < 0] + np.pi
angles = np.rad2deg(angles)
labels = []
for label, angle in zip(ax.get_xticklabels(), angles):
x,y = label.get_position()
lab = ax.text(x,y-.65, label.get_text(), transform=label.get_transform(),
ha=label.get_ha(), va=label.get_va())
lab.set_rotation(angle)
labels.append(lab)
ax.set_xticklabels([])
plt.subplots_adjust(top=0.68,bottom=0.32,left=0.05,right=0.95)
plt.show()
import pandas as pd import matplotlib.pyplot as plt import numpy as np data = {'0-b__|ce0Ji|aaaiIi9abGc_|ti5l-baa1tcciii|irGi': 0.28774963897009614, '0-b__|ce0Ji|aaaiIi9abGc_|ti6l-baa1tcciii|irGi': 0.18366735937444964, 'allb_e__|tla1a|ali|_auc7en_|e': -0.11720263463773731, 'b__0|lp|..ii80p.e7l_|an4obln.llll0ai|': -0.021168680215561269, 'b__Ass8._ii8.c4on|Ay|mbessoxiAxa': 0.17845443978725653, 'b__Bts4o_rrtiordae|Bei|obe7rattrniBno': 0.32077066676059313, 'b__|aaa|tteiatlim_|e1rblttaaeei|e': -0.27915536613715614, 'b__|as4.|ei2.l7ov_|e0tblaaoxi|xa': 0.43309499489274772, 'b__|as4.|ei2.l7ov_|e9tblaaoxi|xa': 0.47835581698425556, 'b__|cu|ppripcae_|co2tbopnccpei|': -0.20330386390053184, 'b__|eoea|cccimacnuuh_|ra0obarceenbi|ba': 0.062889648127927869, 'b__|oa|ggrigoip_|nr6ybmgvoohii|i': -0.045648268817583035, 'b__|p1|ooiioi4rs_|sr5eba0otsoi|ox': -0.52544820541720971, 'b__|paa|piatgn_|hy1cboippoli|la': 0.27260399422352155, 'b__|triu|mmriumay_|eb4ebcimrttnhi|hc': 0.62680074671550845, 'b__|tru|mmriumad_|eb2obcmittisi|': 0.34780388151174668, 'etob_m__|aol2l|ooeui|_lool7r': 0.4856468599203973, 'etpb_s__|apl2l|lleni|_loll8e': 0.24430277200521291, 'ib__rCalc_hhdiorchubai|CSt|absahodrsiCsaaca': -0.13484907188897891, 'nlab___|oa1i|ssni|_iesa9': 0.13636363636363635, 'nlnb_i__|dn1t|rrnfi|_tera8ig_|e': -0.056954668733049205, 'nrfb_h__|afl3r|ssnti|_resl3yn_': 0.56102285935683849, 'o5b__l|rcoa|eecialaeprh_|as1o5bie0trrnlii|irLa': 0.53377831002782572, 'oelb_a__Aelt3_rrovi__rro|a': 0.32230284245007218, 'oelb_a__Aelt4_rrovi__rro|a': 0.16580958754534889, 'porb_i__Ctrc6c_oopci__cloa|ny|C': 0.38260364199922509, 'porb_i__Ctrc7g_rrpci__glra|ay|C': 0.51829805219964076, 'ptab_a__|hac2b|uupci|_boui3ct_|': 0.50873516255151285, 'reab_a__|aa2a|rrrhi|_axrl4ra_|': -0.47742242259871087, 'sb__o|sSac|ccnibocsctlhd_|a0dbuacmssioai|anCca': 0.42733612764608503, 'teob___|oa1b|iiti|_bnil3': -0.32684653587404461, 'uoib_i__|ia2a|bbuli|_arbi2it': -0.13636363636363635} Se_corr = pd.Series(data, name="correlation") def plot_polar(r): with plt.style.context("seaborn-whitegrid"): fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(111, polar=True) ax.set_rmax(2) #ax.set_rticks([]) ticks= np.linspace(0, 360, r.index.size + 1)[:-1] ax.set_xticks(np.deg2rad(ticks)) ax.set_xticklabels(r.index, fontsize=15,) angles = np.linspace(0,2*np.pi,len(ax.get_xticklabels())+1) angles[np.cos(angles) < 0] = angles[np.cos(angles) < 0] + np.pi angles = np.rad2deg(angles) for i, theta in enumerate(angles[:-1]): ax.plot([theta,theta], [0,r[i]], color="black") ax.scatter(x=theta,y=r[i], color="black") fig.canvas.draw() labels = [] for label, theta in zip(ax.get_xticklabels(), angles): x,y = label.get_position() lab = ax.text(x, y, label.get_text(), transform=label.get_transform(), ha=label.get_ha(), va=label.get_va()) lab.set_rotation(theta) labels.append(lab) ax.set_xticklabels([]) return fig, ax fig,ax = plot_polar(Se_corr) plt.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.