我使用seaborn软件包制作了一个情节。这是代码:
ax = sns.pointplot(x='latency_condition', y='flow', color=colors[0], ci=95, data=df_new,
scale=.5, linestyles='dotted', errwidth=2, capsize=.3)
ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
ax.set_xlabel("E(latency)", fontweight='bold')
ax.set_ylabel("Flow score", fontweight='bold')
ax.set_yticklabels(['min','','','neutral','','','max'])
ax.set(ylim = (10,70))
plt.axhline(y=40, color=colors[3], linestyle='--', linewidth=1)
plt.savefig("fig4_flow.pdf", bbox_inches='tight')
plt.show()
一切正常。现在,我在间隔级别的x轴上具有分类级别。它们表示延迟值,不幸的是,它们很“丑陋”:[162、245、328、412、495、578]
例如,如果我的x轴每100个刻度线有一个刻度,我会更喜欢它,以提高可读性。但是,seaborn(正确地)将它们视为分类级别,因此我不能只更改x轴。
我想做的是:
答案 0 :(得分:1)
我不认为这不是一个坏主意。 pointplot()
旨在用于分类数据,并且将其与连续数据一起使用(即使您的x轴仅使用几个离散值)也会带来麻烦。
无论如何,在seaborn的pointplot()
中,分类变量的级别在x轴上的坐标为0,1,...,N-1处绘制。既然您知道这些点上每个点的延迟值,那么只需进行线性插值即可找到需要选择的整数的x值。
ticks = [162, 245, 328, 412, 495, 578]
new_ticks = [150,250,350,450,550]
df = pd.DataFrame({'value': np.random.random(size=(100,)), 'cat': np.random.choice(ticks, size=(100,))})
fig, (ax1, ax2)= plt.subplots(1,2, figsize=(8,4))
ax1.set_title('original')
sns.pointplot(x='cat',y='value',data=df, ax=ax1)
ax2.set_title('rescaled')
sns.pointplot(x='cat',y='value',data=df, ax=ax2)
x_ticks = ax2.get_xticks()
s = (x_ticks[-1]-x_ticks[0])/(ticks[-1]-ticks[0])
i = x_ticks[0] - s*ticks[0]
new_x_ticks = s*np.asarray(new_ticks) + i
ax2.set_xticks(new_x_ticks)
ax2.set_xticklabels(new_ticks)
答案 1 :(得分:1)
一个想法是使用辅助x轴并设置与-0.5和5.5点相对应的限制:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# create some random data
N = 100
a = [162, 245, 328, 412, 495, 578]
x = np.random.choice(a, N)
y = np.random.normal(65 - x / 20, 10, N)
df_new = pd.DataFrame({'latency_condition':x, 'flow': y})
fig, ax1 = plt.subplots()
ax2 = ax1.twiny()
sns.pointplot(ax=ax2, x='latency_condition', y='flow', color='dodgerblue', ci=95, data=df_new,
scale=.5, linestyles='dotted', errwidth=2, capsize=.3)
# ax2.tick_params(axis='x', rotation=45)
# ax1.tick_params(axis='x', rotation=45)
ax2.set_xlabel("")
ax1.set_xlabel("E(latency)", fontweight='bold')
ax1.set_xlim(1.5*a[0] - 0.5*a[1], -0.5*a[-2] + 1.5*a[-1])
ax1.set_ylabel("Flow score", fontweight='bold')
ax1.set_yticklabels(['min','','','neutral','','','max'])
ax1.set(ylim = (10,70))
ax1.axhline(y=40, color='crimson', linestyle='--', linewidth=1)
#plt.savefig("fig4_flow.pdf", bbox_inches='tight')
plt.tight_layout()
plt.show()