【问题标题】:How to rotate labels to follow contours in Python?如何在 Python 中旋转标签以跟随轮廓?
【发布时间】:2015-12-18 19:00:57
【问题描述】:

我有以下形式的数据 (link):

Y   X 0 X 10    X 20
15  4.83    4.91    4.99
20  4.58    4.65    4.73
25  4.43    4.49    4.56

我正在尝试绘制 X 标签值的轮廓,在这些情况下为 0、10、20(代码中的 z),x 轴作为 X 值,y 轴作为 Y 值.使用代码创建绘图:

import numpy as np
import re
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import matplotlib.cm as cm

with open('contour.dat', "r") as data:
    while True:
        line = data.readline()
        if not line.startswith('#'):
            break
    data_header = [i for i in line.strip().split('\t') if i]
_data_ = np.genfromtxt('contour.dat', skiprows = 2, delimiter = '\t')
x = _data_[:, 0]
y = _data_[:, 1:]


y_n = []
for i in range(len(data_header)):
    if data_header[i][0] == 'X':
        y_n = np.int_(np.append(y_n, i))
y_index = [data_header[i] for i in y_n]
z = []
for i in range(0, len(data_header)):
    z = np.append(z, re.findall(r"[-+]?\d*\.\d+|\d+", data_header[i]))
z = z.reshape(len(z), 1)
xm = np.tile(x, 21)
xm = np.reshape(xm,(21, 10)).T
zm = np.tile(z, 10).T

with PdfPages('./on_tau.pdf') as p_tau:
    _p_vs_tau_ = plt.figure(figsize=(5, 5))
    _p_vs_tau_.clf()
    p_vs_tau = plt.subplot(111)
    # x, y = np.meshgrid(x, y)
    surf = plt.contourf(y, xm, zm, 22, rstride=1, cstride=1, cmap=cm.gist_heat,
                           linewidth=0, antialiased=False, alpha = 1.0)
    surf1 = plt.contour(y, xm, zm, 22, colors = '#000000',
                           linewidths=0.5, antialiased=False, alpha = 1.0)
    plt.clabel(surf1, inline=1, fontsize=6)
    plt.xlim([5, 10])
    p_tau.savefig(bbox_inches='tight')
    plt.close()

我正在尝试解决以下问题:

1.目前所有的轮廓标签都是垂直的。我怎样才能旋转 跟随轮廓的标签?

2。如何改变标签的位置,使其不重叠(如图)?

其他问题

3.即使轴,如何确保标签始终显示在图上 限制改变了吗?

【问题讨论】:

  • 最简单的选择可能是使用鼠标手动定位标签。您可以通过将manual=True 传递给plt.clabel 来做到这一点。
  • 你用的是什么版本的mpl?标签默认旋转,见matplotlib.org/examples/pylab_examples/contour_demo.html
  • 我无法检查您的代码,因为您没有包含您的数据。
  • 我想知道它是否与您的 rcParams 有关。特别是,看起来您可能正在使用 TeX 呈现文本。你试过设置plt.rcParams['text.usetex'] = False吗?

标签: python matplotlib plot contour


【解决方案1】:

我在matplotlib 1.4.3 中运行了下面的代码并获得了你想要的旋转轮廓标签,所以,我不知道你为什么会遇到这个问题。对于您的第二个问题,使用较少的轮廓级别怎么样?

import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt

x, y = np.pi*np.mgrid[-1:1:101j, -1:1:101j]
z = np.sin(x)*np.sin(y)

with PdfPages('./contour_plot.pdf') as p_tau:
    _p_vs_tau_ = plt.figure(figsize=(5, 5))
    _p_vs_tau_.clf()
    p_vs_tau = plt.subplot(111)
    surf = plt.contourf(y, x, z, 21, rstride=1, cstride=1, cmap="RdYlBu",
                           linewidth=0, antialiased=False, alpha = 1.0)
    surf1 = plt.contour(y, x, z, 21, colors='k', linestyles="solid",
                           linewidths=0.5, antialiased=False, alpha = 1.0)
    plt.clabel(surf1, inline=1, fontsize=6)
    plt.savefig("contour_plot.png", dpi=600)
    p_tau.savefig(bbox_inches='tight')    
    plt.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多