阴影三角形的面积
Shading the area of a triangle
这是我的代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
x = np.random.randint(1,100,100)
y = np.random.randint(-500,200,100)
plt.scatter(x, y)
ax = plt.gca()
ax.invert_yaxis()
x1, y1 = [0, 100], [-200, 0]
x2, y2 = [0, 0], [0, -200]
x3, y3 = [0, 100], [0, 0]
plt.plot(x1,y1,x2,y2,x3,y3, marker = 'o')
plt.show()
plt.show()
有两个问题
- 我想让三角形两边的颜色相同,我该怎么做?
- 我想对三角形下方的区域进行阴影处理,使其成为半透明的,即我可以看到三角形内的散点图的点。这可行吗?
您可以通过列出 3 个 xy 坐标来表示一个三角形。重复第一个点创建一个封闭的多边形。转换为 numpy 可以更容易地 select 仅 x 和 y 坐标,如 triangle[:,0]
中的 x 坐标。
fill
创建一个填充的多边形,其中 alpha
带来半透明。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randint(1, 100, 100)
y = np.random.randint(-500, 200, 100)
ax = plt.gca()
ax.scatter(x, y)
ax.invert_yaxis()
points = [[0, -200], [100, 0], [0, 0]]
triangle = np.array(points + points[:1])
ax.plot(triangle[:, 0], triangle[:, 1], marker='o')
ax.fill(triangle[:, 0], triangle[:, 1], color='yellow', alpha=0.3)
for xi, yi in points:
ax.text(xi, yi, f' x:{xi:.0f}\n y:{yi:.0f}', color='red', fontsize=12, weight='bold',
va='top' if yi > -100 else 'bottom')
ax.set_xlim(xmax=120) # more space for text
plt.show()
PS:此答案使用 fill
,因为它适用于一般三角形(以及更复杂的多边形)。 fill_between(x1, y1)
填充线段 x1,y1
和 y=0
之间的区域。正如在问题的示例中 y3
无处不在 0
,fill_between(x1, y1)
将为示例三角形着色。如果 y3
有不同的值,但 x3
和 x1
仍然相等,那么 fill_between(x1, y1, y3)
就可以了。对于更随意的三角形,fill_between
会比较麻烦。
您只需在plot()
中指定color
属性。至于底纹,需要fill_between()
函数:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
x = np.random.randint(1,100,100)
y = np.random.randint(-500,200,100)
ax = plt.gca()
ax.scatter(x, y)
ax.invert_yaxis()
x1, y1 = [0, 100], [-200, 0]
x2, y2 = [0, 0], [0, -200]
x3, y3 = [0, 100], [0, 0]
ax.plot(x1,y1,x2,y2,x3,y3, marker = 'o', color='red')
ax.fill_between(x1, y1, facecolor='red', alpha=0.5)
plt.show()
输出:
更一般地说,您可以使用 matplotlib 补丁和集合填充任何多边形 (example):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
x = np.random.randint(1,100,100)
y = np.random.randint(-500,200,100)
plt.scatter(x, y)
ax = plt.gca()
ax.invert_yaxis()
vertices = np.array([[0,0],[0,-200.0],[100.0,0]])
patches = []
triangle = Polygon(vertices, True)
patches.append(triangle)
p = PatchCollection(patches, alpha=0.4)
ax=plt.gca()
ax.add_collection(p)
plt.show()
这是我的代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
x = np.random.randint(1,100,100)
y = np.random.randint(-500,200,100)
plt.scatter(x, y)
ax = plt.gca()
ax.invert_yaxis()
x1, y1 = [0, 100], [-200, 0]
x2, y2 = [0, 0], [0, -200]
x3, y3 = [0, 100], [0, 0]
plt.plot(x1,y1,x2,y2,x3,y3, marker = 'o')
plt.show()
plt.show()
有两个问题
- 我想让三角形两边的颜色相同,我该怎么做?
- 我想对三角形下方的区域进行阴影处理,使其成为半透明的,即我可以看到三角形内的散点图的点。这可行吗?
您可以通过列出 3 个 xy 坐标来表示一个三角形。重复第一个点创建一个封闭的多边形。转换为 numpy 可以更容易地 select 仅 x 和 y 坐标,如 triangle[:,0]
中的 x 坐标。
fill
创建一个填充的多边形,其中 alpha
带来半透明。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randint(1, 100, 100)
y = np.random.randint(-500, 200, 100)
ax = plt.gca()
ax.scatter(x, y)
ax.invert_yaxis()
points = [[0, -200], [100, 0], [0, 0]]
triangle = np.array(points + points[:1])
ax.plot(triangle[:, 0], triangle[:, 1], marker='o')
ax.fill(triangle[:, 0], triangle[:, 1], color='yellow', alpha=0.3)
for xi, yi in points:
ax.text(xi, yi, f' x:{xi:.0f}\n y:{yi:.0f}', color='red', fontsize=12, weight='bold',
va='top' if yi > -100 else 'bottom')
ax.set_xlim(xmax=120) # more space for text
plt.show()
PS:此答案使用 fill
,因为它适用于一般三角形(以及更复杂的多边形)。 fill_between(x1, y1)
填充线段 x1,y1
和 y=0
之间的区域。正如在问题的示例中 y3
无处不在 0
,fill_between(x1, y1)
将为示例三角形着色。如果 y3
有不同的值,但 x3
和 x1
仍然相等,那么 fill_between(x1, y1, y3)
就可以了。对于更随意的三角形,fill_between
会比较麻烦。
您只需在plot()
中指定color
属性。至于底纹,需要fill_between()
函数:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
x = np.random.randint(1,100,100)
y = np.random.randint(-500,200,100)
ax = plt.gca()
ax.scatter(x, y)
ax.invert_yaxis()
x1, y1 = [0, 100], [-200, 0]
x2, y2 = [0, 0], [0, -200]
x3, y3 = [0, 100], [0, 0]
ax.plot(x1,y1,x2,y2,x3,y3, marker = 'o', color='red')
ax.fill_between(x1, y1, facecolor='red', alpha=0.5)
plt.show()
输出:
更一般地说,您可以使用 matplotlib 补丁和集合填充任何多边形 (example):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
x = np.random.randint(1,100,100)
y = np.random.randint(-500,200,100)
plt.scatter(x, y)
ax = plt.gca()
ax.invert_yaxis()
vertices = np.array([[0,0],[0,-200.0],[100.0,0]])
patches = []
triangle = Polygon(vertices, True)
patches.append(triangle)
p = PatchCollection(patches, alpha=0.4)
ax=plt.gca()
ax.add_collection(p)
plt.show()