Matplotlib线位置在增加线粗细时移动

8cdiaqws  于 2023-08-06  发布在  其他
关注(0)|答案(3)|浏览(89)

我试着画两条线来表示河流两岸的土地覆盖。但是,当我增加链接厚度时,线位置实际上会移动,因此线会偏移,看起来似乎在分析开始(零距离)之前开始。当我减小线宽时,偏移会减小,但不会完全消失。线需要相对粗,使得图案在所产生的图中是可解释的。
Part of the figure plot - with line thickness of 10
Part of the figure plot - with line thickness of 3
请参见下面的河流左岸代码示例。leftBank_filled是一个Pandas Dataframe,使用的列是'rev2003_LC'(=土地使用)和'ColorFormula',它是给定土地使用的相关颜色。xDistl具有如进一步向下的X位置的检查中所示的值,并且yL是常数,以沿着每个组的图的顶部(或底部)创建水平线。

if len(Ldist_km) == len(leftBank_filled['rev2003_LC']):
        print('plotting left')
        for Lp in range(len(leftBank_filled['rev2003_LC'])-1):
            xDist1 = [Ldist_km[Lp],Ldist_km[Lp+1]]
            xDist1List.append(xDist1)
            plt.plot(xDist1,yL,color=leftBank_filled['ColorFormula'][Lp],linewidth=3)

字符串
我已经修改了我的代码来检查x分量的绘图位置,我可以确认它们是预期值(见下图)。
Check of x positions used in the plotting of the land cover lines
我已经增加和减少了线的厚度,以确认这是导致问题的变量。

n6lpvg4x

n6lpvg4x1#

下面所有的白色都有一个 x 跨度0-1,彩色线也有相同的 x 跨度,但由于线宽大和不同的“帽样式”,它们的长度或外观不同。
x1c 0d1x的数据

也许你想摆弄Matplotlib的“帽样式”...

import matplotlib.pyplot as plt

capstyles = ('butt',  'round', 'projecting', None)
capnames  = ('butt',  'round', 'projecting', 'default')
ys = (0.00, 0.33, 0.67, 1.00)
text_options = dict(ha='center', va='center', weight='bold', zorder=5)

for capstyle, capname, y in zip(capstyles, capnames, ys):
    plt.plot((0,1), (y,y), lw=30, zorder=3, solid_capstyle=capstyle)
    plt.plot((0,1), (y,y), lw= 1, color='w', zorder=4)
    plt.text(.5, y, capname, **text_options)
plt.xlim((-0.1, 1.1))
plt.ylim((-0.1, 1.1))
plt.yticks([])

字符串

9njqaruj

9njqaruj2#

不确定这个问题,也许可以提供一个可重复的例子。
但如果你使用更大的线宽,它会从你正在绘制的值的两侧扩展,请参阅:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

xmin, xmax = 0, 3
lines_position = np.arange(xmin, xmax, 0.2)
lines_ymin, lines_ymax = 0, 0.02

# Plot vertical lines
kwargs = {"x": lines_position, "ymin": 0, "ymax": 0.02, "alpha": 0.5}
# with linewidth=10
ax.vlines(**kwargs, linewidth=10, color="red", label="lw=10")
# with linewidth=1
ax.vlines(**kwargs, linewidth=1, color="black", label="lw=1")

# Better viz
ax.set_xticks(np.arange(xmin, xmax, 1))
ax.set_xticks(np.arange(xmin, xmax, 0.1), minor=True)
ax.xaxis.grid(which="major")
ax.xaxis.grid(which="minor", linestyle=":")
ax.set_ylim(None, 0.3)
ax.legend()

plt.show()

字符串


的数据

prdp8dxp

prdp8dxp3#

我无法评论@paime的答案,但这里有一个可重复的问题示例,基本上行结束似乎也被线宽填充:

# import modules
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

xmin, xmax = 0, 50
line_x = np.arange(xmin, xmax+1, 1.)
line_y1 = np.ones(len(line_x))
line_y2 = np.ones(len(line_x))*2

# Plot horizontal lines
plt.plot(line_x, line_y1, '-', linewidth=10, color="red", label="lw=10")
plt.plot(line_x, line_y2, '-', linewidth=3,  color="black", label="lw=3")

# Better viz
ax.set_xticks(np.arange(xmin, xmax+1, 10))
ax.set_xticks(np.arange(xmin, xmax, 1), minor=True)
ax.xaxis.grid(which="major")
ax.xaxis.grid(which="minor", linestyle=":")
ax.set_ylim(0, 10.)
ax.legend()

plt.show()

字符串
Imgur我不能直接发布图像,由于低代表。
我已经在linestyle属性和类似的戳周围,不能找到一个解决这个问题的办法。唯一的建议是在顶部绘制白色多边形,直到使用补丁所需的边缘,但非常不满意。

相关问题