我想为两个不同的数据集创建一个绘图,类似于本answer所示的数据集:
在上图中,作者设法通过将x中的一些小随机散布添加到新数据集中来解决误差线的重叠问题。
在我的问题中,我必须绘制类似的图形,但是在x轴上有一些分类数据:
关于如何使用x轴上的分类变量稍微移动第二个数据集的误差线的任何想法?我希望避免条形之间的重叠,从而使可视化变得更容易。
答案 0 :(得分:2)
您可以通过将默认数据转换添加到数据空间中的先前转换来转换每个错误栏。当知道类别通常彼此相距一个数据单元时,这是可能的。
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
from matplotlib.transforms import Affine2D
x = list("ABCDEF")
y1, y2 = np.random.randn(2, len(x))
yerr1, yerr2 = np.random.rand(2, len(x))*4+0.3
fig, ax = plt.subplots()
trans1 = Affine2D().translate(-0.1, 0.0) + ax.transData
trans2 = Affine2D().translate(+0.1, 0.0) + ax.transData
er1 = ax.errorbar(x, y1, yerr=yerr1, marker="o", linestyle="none", transform=trans1)
er2 = ax.errorbar(x, y2, yerr=yerr2, marker="o", linestyle="none", transform=trans2)
plt.show()
或者,您可以在应用数据变换后转换误差线,并以点为单位移动误差线。
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
from matplotlib.transforms import ScaledTranslation
x = list("ABCDEF")
y1, y2 = np.random.randn(2, len(x))
yerr1, yerr2 = np.random.rand(2, len(x))*4+0.3
fig, ax = plt.subplots()
trans1 = ax.transData + ScaledTranslation(-5/72, 0, fig.dpi_scale_trans)
trans2 = ax.transData + ScaledTranslation(+5/72, 0, fig.dpi_scale_trans)
er1 = ax.errorbar(x, y1, yerr=yerr1, marker="o", linestyle="none", transform=trans1)
er2 = ax.errorbar(x, y2, yerr=yerr2, marker="o", linestyle="none", transform=trans2)
plt.show()
尽管两种情况下的结果看起来都相似,但它们根本不同。交互式缩放轴或更改图形大小时,您会观察到这种差异。
答案 1 :(得分:0)
考虑以下方法来突出显示图-cmake_minimum_required(VERSION 3.3)
project(AVT7)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework GLUT -framework OpenGL -framework Cocoa")
include_directories(/usr/local/Cellar/freeglut/3.0.0/include)
link_directories(/usr/local/Cellar/freeglut/3.0.0/lib)
add_executable(AVT7 hello.cpp)
target_link_libraries(AVT7 glut)
和errorbar
的组合具有非零透明度:
fill_between
结果: