在Seaborn线图中移动刻度线的位置

时间:2020-03-02 19:28:50

标签: python python-3.x matplotlib seaborn

我使用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轴。enter image description here

我想做的是:

  • 删除当前的xticks,并用新的替换(例如,每100个)
  • 这样做的方式是,新的xticks尊重坐标系(因为旧的xticks也被均匀地隔开,代表了底层的连续体)。

2 个答案:

答案 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)

enter image description here

答案 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()

resulting plot