Nano Hash - криптовалюты, майнинг, программирование

Вращение маркера matplotlib на 2D-холсте не вращается должным образом. Как правильно повернуть маркер matplotlib по его центру?

в настоящее время у меня возникают проблемы с правильным вращением маркера с помощью функции графика в matplotlib. Я использую маркер как стрелку и хочу, чтобы линия, на которой он находится, проходила через кончик стрелки. В настоящее время это работает для любого поворота, кратного 90 градусам.

Текущий код у меня такой.

import matplotlib.pyplot as plt
from matplotlib.markers import MarkerStyle
from math import sqrt, atan, pi

point_1 = [1,1]
point_2 = [1,2]
mid_point = ((point_1[0] + point_2[0]) / 2, (point_1[1] + point_2[1]) / 2)
plt.plot(mid_point[0], mid_point[1], marker=(3, 0, 0), markersize=20, linestyle='None')
plt.plot([point_1[0], point_2[0]], [point_1[1], point_2[1]], linewidth=1, linestyle='-')

point_1 = [1,1]
point_2 = [2,2]
mid_point = ((point_1[0] + point_2[0]) / 2, (point_1[1] + point_2[1]) / 2)
plt.plot(mid_point[0], mid_point[1], marker=(3, 0, -45), markersize=20, linestyle='None')
plt.plot([point_1[0], point_2[0]], [point_1[1], point_2[1]], linewidth=1, linestyle='-')

point_1 = [2,2]
point_2 = [3,2]
mid_point = ((point_1[0] + point_2[0]) / 2, (point_1[1] + point_2[1]) / 2)
plt.plot(mid_point[0], mid_point[1], marker=(3, 0, -90), markersize=20, linestyle='None')
plt.plot([point_1[0], point_2[0]], [point_1[1], point_2[1]], linewidth=1, linestyle='-')



plt.xlim([0,4])
plt.ylim([0,4])

plt.show()

что дает следующий рисунок.

введите здесь описание изображения

Как видите, стрелка в середине должна быть отцентрована на линии, на которой она находится под углом 45 градусов, но это не так. Я также проверил это под разными углами, и кажется, что чем ближе поворот к 45 градусам, тем больше стрелка отклоняется от линии. Это то же самое для всех углов между кратными 90 градусам.

Есть ли способ исправить это. Я считаю, что это связано с центром вращения маркеров, но я не уверен, как это изменить.


Ответы:


1

Проблема в том, что линия с наклоном 1 обычно не находится под углом 45 градусов. Если сделать оси одинаковыми по диапазону и квадрату, то углы совпадут:

plt.figure(figsize=(6,6))

введите здесь описание изображения

Вы также можете установить угол на основе угла построенной линии (когда оси не являются квадратными), но вам нужно решить, что вы хотите оставить постоянным.

17.07.2020
  • Если вы не возражаете, я спрошу, как мне найти угол построенной линии? Есть ли функция, которую я могу использовать для получения текущего figsize? 17.07.2020
  • @Trenton: Можно узнать длину осей и размер фигуры и установить правильное значение угла для заданного наклона, но тогда это не будет работать, если вы измените размер графика или, возможно, при печати, например, для публикации. Было бы лучше взять эту информацию там, где вы теперь знаете, что является настоящей проблемой, и продумать, что вам действительно нужно. Возможно, стрелка или даже рисовать из линий; и то, и другое было бы лучше, чем копаться в использовании маркера, имхо. 18.07.2020
  • @Trenton: В целом, я бы посоветовал: 1) понять проблемы здесь (которые заключаются в том, что графики имеют несколько систем координат, работающих одновременно, и что обычно предполагается, что оси x и y масштабируются независимо, поэтому углы не представлены хорошо); и 2) я предполагаю, что некоторые факторы графика были сделаны из-за удобства, поэтому решите, что вам нужно на вашем графике с нуля (если вы использовали стрелки, вы бы предпочли, чтобы все они были одинаковой длины или масштаба с длиной стрелки). линии; вы хотите, чтобы они были в начале, середине или конце строки и т. д.) и задайте новый вопрос на основе этих деталей. 18.07.2020
  • Например, этот тип линейного графика со стрелками очень прост и выглядит хорошо, имхо, и его легче просматривать, потому что зрителю не нужно делать двойной дубль, чтобы переназначить маркер треугольника, притворяясь, что это стрелка направления. Я бы поверил вам, если бы вы сказали: «Нет, вам просто нужно именно то, что вы показали на своем графике, но, как правило, если кто-то неправильно понимает основной принцип программного обеспечения, в конце концов он хочет чего-то другого. 18.07.2020
  • Спасибо за помощь. Я решил использовать стрелки 19.07.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..