用数据打断的虚线绘图(类似于等高线图)

18

我遇到了一个(希望)简单的问题。我的目标是绘制一条虚线并在其中间插入数据(不仅限于文本)。

我想象中可能的结果示例

由于我只知道如何通过 linestyle = 'dashed' 创建虚线,所以需要帮助将数据放在虚线之间,非常感谢。

关于标签方面,有类似的东西已经存在于Matplotlib - 就像我在等高线演示中看到的那样。

Matplotlib Contour Demo

更新:

Richard 在评论中提到的问题链接非常有帮助,但与我在评论中提到的不完全相同。目前,我是这样做的:

line_string2 = '-10 ' + u"\u00b0" +"C"
l, = ax1.plot(T_m10_X_Values,T_m10_Y_Values)
pos = [(T_m10_X_Values[-2]+T_m10_X_Values[-1])/2., (T_m10_Y_Values[-2]+T_m10_Y_Values[-1])/2.]
# transform data points to screen space
xscreen = ax1.transData.transform(zip(T_m10_Y_Values[-2::],T_m10_Y_Values[-2::]))
rot = np.rad2deg(np.arctan2(*np.abs(np.gradient(xscreen)[0][0][::-1])))
ltex = plt.text(pos[0], pos[1], line_string2, size=9, rotation=rot, color='b',ha="center", va="bottom",bbox = dict(ec='1',fc='1', alpha=0.5))

您可以在此处查看结果的快照。减去20℃是不带BBox的。

输入图像描述


1
嗨 - 我已经在问题中编辑了图片。你能否编辑一个 最小完整可验证示例 ,即你目前用于绘制线条的代码和你想要放置在虚线之间的数据?然后我们可能可以提供帮助 - 我认为没有简单的“一刀切”解决方案,比如“使用style=dashes_with_labels”或其他任何东西。 - J Richard Snape
1
实际上,您可能想查看这个问题和答案https://dev59.com/J2Ij5IYBdhLWcg3wy4DH。这可能已经足够了。如果不行,并且您无法调整它们以获得所需的重复效果,请在您的问题中添加对这些内容的引用(以显示您已经知道),并指定重复标签对您很重要。 - J Richard Snape
大家好,Richard提供的链接正中下怀,至少看起来是这样。结果正是我所需要的。但是我在imshow后面有一个网格,而不是白色背景。可以看到,虚线和文本是bbox的结果,覆盖了该行。使用zorder也没有解决问题。但是目前为止,我可以接受这个解决方案。如果没有其他方法的话。 - Matthias
我认为你想让20出现在图表中其他所有元素的前面。你需要调查zorder属性。简单来说,zorder越高,绘制的元素就越靠前。你对plt.text的调用在这里有文档,你可以看到你可以设置zorder。所以尝试将该调用更改为plt.text(pos[0], pos[1], line_string2, size=9, rotation=rot, color='b',ha="center", va="bottom", zorder=100),看看是否符合你的要求。 - J Richard Snape
请注意 - 您可以在许多matplotlib调用中设置“zorder”,控制哪些元素绘制在其他元素的前面。 - J Richard Snape
1个回答

1
快速而简单的答案使用annotate
import matplotlib.pyplot as plt
import numpy as np

x = list(reversed([1.81,1.715,1.78,1.613,1.629,1.714,1.62,1.738,1.495,1.669,1.57,1.877,1.385]))
y = [0.924,0.915,0.914,0.91,0.909,0.905,0.905,0.893,0.886,0.881,0.873,0.873,0.844]

def plot_with_text(x, y, text, text_count=None):
    text_count = (2 * (len(x) / len(text))) if text_count is None else text_count
    fig, ax = plt.subplots(1,1)
    l, = ax.plot(x,y)
    text_size = len(text) * 10
    idx_step = len(x) / text_count
    for idx_num in range(text_count):
        idx = int(idx_num * idx_step)
        text_pos = [x[idx], y[idx]]
        xscreen = ax.transData.transform(zip(x[max(0, idx-1):min(len(x), idx+2)], y[max(0, idx-1):min(len(y), idx+2)]))
        a = np.abs(np.gradient(xscreen)[0][0])
        rot = np.rad2deg(np.arctan2(*a)) - 90
        ax.annotate(text, xy=text_pos, color="r", bbox=dict(ec="1", fc="1", alpha=0.9), rotation=rot, ha="center", va="center")

plot_with_text(x, y, "test")

产生:

plot

你可以调整偏移量以获得更令人满意的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接