matplotlib 突出显示特定象限并使用名称标记点

eyh26e7m  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(96)

我有一个3D散点图,有变量A,B,C。我想突出显示图的象限,在该象限中,点高于A,B,C的平均值。
目前,我有一个散点图,其中的平均值是每个变量的线。红线是B的平均值,蓝色是A的平均值。两条线都在C的平均值的高度。
因此,重要的点在红线后面,在蓝线前面和两条线的上方。我不确定这是否是显示数据的直观方式。我想我可以添加一个平原到这个地区,以突出它,但我不知道如何做到这一点。
我还需要添加标签的点,我不知道如何做到这一点。我猜应该是这样的

for i in range(len(df)): 
  x = m[i,0]
  y = m[i,1]
  z = m[i,2]
  label = i
  ax.scatter(x,y,z, color='b')
  ax.text(x,y,z, '%s' % (label), size=20, zorder=1, color='k')

但我不知道这是如何工作的,所以我不知道如何适应我的需要。
我的完整代码如下;

import numpy as np
import pandas as pd
import random
import string
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Sample Dataframe
names=[]

df = pd.DataFrame(np.random.randint(0,200,size=(200, 3)), columns=list('ABC'))
for item in df['A']:
    names.append(random.choice(string.ascii_letters))
df['name']=names
df.head(2)

# Plotting
plt.rcParams["figure.figsize"] = (20,10)

x = df['A']
y = df['B']
z = df['C']

# create the figure
fig = plt.figure()

# add axes
ax = fig.add_subplot(111,projection='3d')
ax.scatter(x,y,z, s=60)

# make lines
xline = [(df['A'].max(),0), (df['B'].mean(),df['B'].mean()),(df['C'].mean(),df['C'].mean())]
ax.plot(xline[0], xline[1], xline[2], 'r')

yline = [(df['A'].mean(),df['A'].mean()), (df['B'].max(),0),(df['C'].mean(),df['C'].mean())]
ax.plot(yline[0], yline[1], yline[2], 'b')

# label the axes
ax.set_xlabel("A")
ax.set_ylabel("B")
ax.set_zlabel("C")
plt.show()
6rvt4ljy

6rvt4ljy1#

我建议去掉这些行,而是将数据过滤到“重要”和“不太重要”的集合中。然后,两者都可以单独绘制,具有不同的颜色和/或大小。
我还为这个过滤的数据集添加了一个标签方法。

import random
import string
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Sample Dataframe
names=[]

df = pd.DataFrame(np.random.randint(0,200,size=(200, 3)), columns=list('ABC'))
for item in df['A']:
    names.append(random.choice(string.ascii_letters))
df['name']=names
df.head(2)

filter = (
    (df['A'] > df['A'].mean()) &
    (df['B'] > df['B'].mean()) &
    (df['C'] > df['C'].mean())
)

# Plotting
plt.rcParams["figure.figsize"] = (20,10)

x = df[filter]['A']
y = df[filter]['B']
z = df[filter]['C']

x_less_important = df[~filter]['A']
y_less_important = df[~filter]['B']
z_less_important = df[~filter]['C']

# create the figure
fig = plt.figure()

# add axes
ax = fig.add_subplot(111,projection='3d')
ax.scatter(x,y,z, s=60)
ax.scatter(x_less_important,y_less_important,z_less_important, s=20)

# label the axes
ax.set_xlabel("A")
ax.set_ylabel("B")
ax.set_zlabel("C")

# label the points
for i in range(len(x)):
  label = df['name'].iloc[i]
  ax.scatter(x.iloc[i],y.iloc[i],z.iloc[i], color='b')
  ax.text(x.iloc[i],y.iloc[i],z.iloc[i], '%s' % (label), size=20, zorder=1, color='k')

plt.show()

相关问题