【问题标题】:Drawing vertical and horizontal lines at each point x,y point using python使用python在每个点x,y点绘制垂直和水平线
【发布时间】:2021-05-31 04:54:25
【问题描述】:

正如标题所述,我有一些随机的 X 和 Y 数据点:

+-----+-----+
| P1X | P1Y |
+-----+-----+
|   1 |   2 |
|   2 |   3 |
|  -1 |   4 |
+-----+-----+

d = {'P1X': [1,2,-1], 'P1Y': [2,3,4]}
df_data = pd.DataFrame(data=d)

然后我使用这样的散点图绘制它们:

import seaborn as sns
from matplotlib import pyplot as plt

ax = sns.scatterplot(data=df_data, x='P1X', y='P1Y', legend=False)
plt.show()
 

现在如何在每个点水平和垂直绘制一条黑线? 任何和所有的答案都值得赞赏!

【问题讨论】:

  • 完全跨越轴的线?所以你会在 -1、1、2 处有 3 条垂直线,在 4、3、2 处有 3 条水平线,或者就像更小的十字准线?
  • axvline 和 axhline 怎么样?我想这就是你要找的。两者都需要各自的 y-x 值和最小值/最大值。您可以根据您拥有的数据计算这两个值。
  • @ALollz 是的,这就是我想要的。如果 seaborn 适合它,我想知道,但这是我的起点。我不太擅长绘制东西哈哈
  • @Sandertjuhh 我计划为我的实际数据设置 xlim 和 ylim 的限制,我是否将其用于最小值和最大值?
  • @Sandertjuhh 所以我正在研究 axvline 和 axhline。看起来不需要熊猫系列。我是否只需要遍历我的 df 并为每对点调用它?还是有比循环更好的方法?

标签: python pandas matplotlib seaborn scatter-plot


【解决方案1】:

您可以简单地循环 x 和 y 值,然后从 plt 调用 axvline 和 axyline。

import matplotlib.pyplot as plt

x_data = [-1, 2, 3]
y_data = [2, 3, 5]

plt.scatter(x_data, y_data, c='red')

for x, y in zip(x_data, y_data):
    plt.axvline(x=x, color='b', linestyle='-')
    plt.axhline(y=y, color='g', linestyle='-')

【讨论】:

  • 好的,根据您的建议,我正在调查它。我不确定是否有比循环遍历我的 df 并这样做更好的方法,或者我是否可以为它传递一个系列。谢谢!
  • @mike_gundy123 我想没有比这更容易的了。如果您正在寻找它,请接受这个作为答案:)。
【解决方案2】:

由于您计划手动设置绘图的限制,因此您可以使用ax.hlines/ax.vlines,为每个发送唯一点坐标的数组。

xlims=(-1.1, 2.1)
ylims=(1.9, 4.9)

fig, ax = plt.subplots()

df_data.plot(kind='scatter', x='P1X', y='P1Y', ax=ax)

ax.hlines(df_data['P1Y'].unique(), xlims[0], xlims[1], color='grey', zorder=-1)
ax.vlines(df_data['P1X'].unique(), ylims[0], ylims[1], color='grey', zorder=-1)

ax.set_xlim(xlims)
ax.set_ylim(ylims)

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 2020-11-16
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多